摘要:網上看到一句話,匿名函數的執行是具有全局性的,那怎么具有的全局性呢閉包內部的指向是,為什么指向了呢下面通過函數調用模式和部分案例分析了為什么確實如此函數調用的模式方法調用模式和函數調用模式如果一個函數被設置為一個對象的屬性,則稱它為一個方法
網上看到一句話,匿名函數的執行是具有全局性的,那怎么具有的全局性呢?閉包內部this的指向是window,為什么指向了window呢?下面通過js函數調用模式和部分案例分析了為什么確實如此1.js函數調用的模式 1.方法調用模式和函數調用模式
如果一個函數被設置為一個對象的屬性,則稱它為一個方法。當通過對象對其進行調用時,即this的方法調用模式。在方法調用模式下,函數中的this指向該函數所屬的對象。
當一個函數并非對象的屬性,而是直接作為函數進行調用時,為函數調用模式。此模式來調用函數的時候,this綁定的是全局對象。這是語言設計的一個錯誤。倘若語言設計正確,那么當內部函數被調用時,this應該仍然綁定到外部函數的this變量。這個設計錯誤的后果就是方法不能利用內部函數來幫助它工作,因為內部函數的this被綁定了錯誤的值,所以不能共享該方法對對象的訪問權
var obj = { val : 1, show : function(){alert(this.val);},//方法調用模式 outFunc : function(){ function innerFunc(){ console.log(this); } innerFunc(); //函數調用模式 } }; obj.innerFunc(); //在嚴格模式下,console.log(this)中的this為undefined, //否則,console.log(this)中的this為全局對象(瀏覽器中為window) //下文講解為什么2.構造器調用模式
當以new來調用一個函數時,即構造器模式。
當使用new調用時,發生這些事情:
創建一個連接到該函數prototype的新對象
將this綁定到創建的新對象上
函數結束時,如果沒有返回其它對象,就返回this,即新創建的對象。
var quo=function(string){ this.status=string; } quo.prototype.get_status=function(){ return this.status; } var qq=new quo("aaa"); alert(qq.get_status());3.上下文調用模式(call,apply)
var myobject={}; var sum = function(a,b){ return a+b; }; var sum2 = sum.call(myobject,10,30); //var sum2 = sum.apply(myobject,[10,30]); alert(sum2);2.閉包和匿名函數案例分析(這兩種都是函數調用模式)
var person = { name :"one", sayOne:function () {//方法調用模式 console.log(this.name) }, sayTwo:function () {//函數調用模式 return function () { console.log(this.name) } }, wrap: function(){//函數調用模式,匿名函數的執行環境具有全局性的由來 (function (){ console.log(this.name) })() } } person.sayOne()//one sayOne調用者是person對象,所以this指向person;(方法調用模式) person.sayTwo()()//window 返回的匿名函數在全局執行所以是window(函數調用模式) person.wrap()//window 語言就是這樣設計的,也是匿名函數具有全局性的由來(函數調用模式)3.事件監聽內部調用方法案例分析
var div=document.getElementById("one"); function f2(){ console.log(this) } div.onclick =function () { console.log(this)//one那個節點 f2()//window(函數調用模式) }4.綜合應用:函數節流案例分析
1.throttle函數的執行環境具有全局性,內部this通常是指向window的,然后返回一個匿名函數。
2.返回的匿名函數綁定了事件,this指向監聽的元素(document)
3.fn其實與上面返回匿名函數形成了閉包,且fn也其實是一個匿名函數,匿名函數的執行具有全局性,fn內部this應該指向window
4這里用apply修正this指向,使fn內部的this重新指向document
function throttle(fn, delay) { console.log(this)//window // 記錄上一次函數觸發的時間 var lastTime = 0; return function() { // 記錄當前函數觸發的時間 var nowTime = Date.now(); if(nowTime - lastTime > delay) { /* fn(); console.log(this)//document */ fn.apply(this)// 修正this指向問題 console.log(this)//document // 同步時間 lastTime = nowTime; } } } document.onscroll = throttle(function() { /*console.log(this)//window*/ console.log(this)//document console.log("scroll事件被觸發了" + Date.now()) }, 1000)5.參考JS高級編程的案例解決問題
var name = "global"; var foo = { name: "foo", getName : function(){ console.log(this.name); } } var bar = { name: "bar", getName : function(){ return (function(){ console.log(this.name); })(); } } foo.getName(); //foo foo.getName.call(bar); //bar foo.getName.call(this); //global foo.getName.call(window); //global (function(){ console.log(this.name) }.bind(bar))(); //bar (function(){ console.log(this.name) }.bind())(); //global
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/109420.html
摘要:網上看到一句話,匿名函數的執行是具有全局性的,那怎么具有的全局性呢閉包內部的指向是,為什么指向了呢下面通過函數調用模式和部分案例分析了為什么確實如此函數調用的模式方法調用模式和函數調用模式如果一個函數被設置為一個對象的屬性,則稱它為一個方法 網上看到一句話,匿名函數的執行是具有全局性的,那怎么具有的全局性呢?閉包內部this的指向是window,為什么指向了window呢?下面通過js...
摘要:網上看到一句話,匿名函數的執行是具有全局性的,那怎么具有的全局性呢閉包內部的指向是,為什么指向了呢下面通過函數調用模式和部分案例分析了為什么確實如此函數調用的模式方法調用模式和函數調用模式如果一個函數被設置為一個對象的屬性,則稱它為一個方法 網上看到一句話,匿名函數的執行是具有全局性的,那怎么具有的全局性呢?閉包內部this的指向是window,為什么指向了window呢?下面通過js...
摘要:到底什么是閉包這個問題在面試是時候經常都會被問,很多小白一聽就懵逼了,不知道如何回答好。上面這么說閉包是一種特殊的對象。閉包的注意事項通常,函數的作用域及其所有變量都會在函數執行結束后被銷毀。從而使用閉包模塊化代碼,減少全局變量的污染。 閉包,有人說它是一種設計理念,有人說所有的函數都是閉包。到底什么是閉包?這個問題在面試是時候經常都會被問,很多小白一聽就懵逼了,不知道如何回答好。這個...
摘要:定義函數表達式的方式有兩種函數聲明。不過,這并不是匿名函數唯一的用途。可以使用命名函數表達式來達成相同的結果閉包匿名函數和閉包是兩個概念,容易混淆。匿名函數的執行環境具有全局性,因此其對象通常指向通過改變函數的執行環境的情況除外。 定義函數表達式的方式有兩種: 函數聲明。它的重要特征就是 函數聲明提升(function declaration hoisting) 即在執行代碼之前會...
閱讀 881·2023-04-26 03:03
閱讀 2205·2021-10-12 10:12
閱讀 1201·2021-09-24 09:48
閱讀 1645·2021-09-22 15:25
閱讀 3331·2021-09-22 15:15
閱讀 914·2019-08-29 16:21
閱讀 1062·2019-08-28 18:00
閱讀 3423·2019-08-26 13:44