在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ js閉包this對象

js閉包this對象

var name = "The Window";
var getNameFunc= {
    name: "My Object",
    getNameFunc: function() {
        return function() {
            return this.name;
        };
    }
};
alert(object.getNameFunc()()); //"The Window"(在非嚴(yán)格模式下)

在高級程序設(shè)計的第7章,7.2.2關(guān)于this對象中,有幾句話實在是不太明白:

以上代碼先創(chuàng)建了一個全局變量 name,又創(chuàng)建了一個包含 name 屬性的對象。這個對象還包含一個方法——getNameFunc(),它返回一個匿名函數(shù),而匿名函數(shù)又返回 this.name。由于 getNameFunc()返回一個函數(shù),因此調(diào)用 object.getNameFunc()()就會立即調(diào)用它返回的函數(shù),結(jié)果就是返回一個字符串。然而,這個例子返回的字符串是"The Window",即全局 name 變量的值。為什么匿名函數(shù)沒有取得其包含作用域(或外部作用域)的 this 對象呢?

前面曾經(jīng)提到過,每個函數(shù)在被調(diào)用時都會自動取得兩個特殊變量: this 和 arguments。內(nèi)部函數(shù)在搜索這兩個變量時,只會搜索到其活動對象為止,因此永遠(yuǎn)不可能直接訪問外部函數(shù)中的這兩個變量。

1.只會搜索到其活動對象??? 不是有個作用域鏈嗎?匿名活動對象在最下面,在匿名對象中找不到,那就去上面的活動對象去找咯?getNameFunc中找不到就去object去找咯。。。不就找到了嗎

2.因此永遠(yuǎn)不可能直接訪問外部函數(shù)中的這兩個變量???是什么意思?外部函數(shù)是指哪個?

回答
編輯回答
乞許

他是在全局執(zhí)行的吧,所以他的this指向是window

2018年6月22日 11:06
編輯回答
故人嘆

你可以通過修改嘗試對 this 加深一下理解 .

1) 將匿名函數(shù)獨立出來給個名字.

稍微調(diào)整如下:

var name = "The Window";
function getThisName(){
    return this.name
}
var object = {
    name: "My Object",
    getNameFunc: function() {
        return getThisName
    }
};
var getThisNameFunc = object.getNameFunc()
console.log(getThisNameFunc()); 

現(xiàn)在你再來看這個 getThisName 這個原來你代碼里面的匿名函數(shù),你是不是可以很清楚的看出它的調(diào)用方是認(rèn)誰了? 很顯示到最后調(diào)用這個方法時是隱式的全局變量 (window, 在瀏覽器環(huán)境)
它跟上面聲明的 object 沒有任何關(guān)系. 只是 object.getNameFunc 這個函數(shù)將這個函數(shù)作為返回值.
如果是返回的其他標(biāo)量,自然也不會發(fā)生關(guān)系.
另外你上面的書也提到了, thisarguments這兩個隱式的變量是在函數(shù)調(diào)用的時候才獲得的.
所以在這個函數(shù)被調(diào)用的時候明顯它的this 只能是全局的 this.

2) 將 object 直接跟 getThisName 建立關(guān)系:

var name = "The Window";
function getThisName(){
    return this.name
}
var object = {
    name: "My Object",
    getNameFunc:getThisName 
};
console.log(object.getNameFunc()); // 輸出: My Object
var getThisNameFunc = object.getNameFunc; 
console.log(getThisNameFunc()); // 輸出: The Window

觀察上面的輸出,你再加深以下對這句話的理解:

每個函數(shù)在被調(diào)用時都會自動取得兩個特殊變量

3) 加深對函數(shù)調(diào)用的理解, 加上 applycall
你看一下如下代碼的輸出:

var name = "The Window";
function getThisName(){
    return this.name
}
var object = {
    name: "My Object",
    getNameFunc:getThisName 
};
console.log(object.getNameFunc()); 
var getThisNameFunc = object.getNameFunc
console.log(getThisNameFunc()); 
console.log(getThisNameFunc.apply(object)); 
console.log(getThisNameFunc.call(object)); 

每個函數(shù)在被調(diào)用時都會自動取得兩個特殊變量

同時你也可以通過使用 apply, call 等內(nèi)置函數(shù)原型的方法來指定函數(shù)調(diào)用時所使用的 this 對象. 如上所示.

JavaScript 的這一特點, 跟 Java 等靜態(tài)語言是很不同的. Java 等靜態(tài)語言,往往由于你方法(注意這里沒有說函數(shù))寫的地方就決定了 this 對象的指向,但是 JavaScript 是動態(tài)語言這一點很不一樣. 所以還需要在后面的實踐中多多注意總結(jié)和理解.

2017年7月17日 08:02
編輯回答
雅痞

首先, 你對函數(shù)(function)沒有理解明白, 所以理解閉包的時候肯定會有困惑.
在函數(shù)內(nèi)部,有兩個特殊的對象arguments(參數(shù))和this。
this對象引用的是函數(shù)執(zhí)行環(huán)境的對象(當(dāng)在網(wǎng)頁全局作用域中調(diào)用函數(shù)時,this對象引用的就是window, window是全局對象)

你可以理解匿名函數(shù)的執(zhí)行環(huán)境是全局. 所以它的this指向window.

不知道你明白沒有, 第一次回答問題, 希望對你有幫助.

2017年2月16日 12:22
編輯回答
扯不斷

首先你的代碼是不是寫錯了。object == getNameFunc ?

完整作用域鏈 匿名()->window

因為是匿名函數(shù)

2017年8月18日 18:40