鍍金池/ 問答/HTML/ this和閉包之間的關(guān)系有點(diǎn)迷糊,誰(shuí)來(lái)給我看一下

this和閉包之間的關(guān)系有點(diǎn)迷糊,誰(shuí)來(lái)給我看一下

javascript this和閉包之間的關(guān)系有點(diǎn)迷糊,哪個(gè)大神進(jìn)來(lái)看一下

最近在看js的基礎(chǔ)相關(guān)的知識(shí)點(diǎn),在看到閉包和this的時(shí)候發(fā)現(xiàn)了問題,哪個(gè)大神幫我分析一下,我分析了一下,分析不下去了,第一個(gè)我搜了網(wǎng)上的資料,貌似能解釋的清楚,但是看到第二個(gè)的時(shí)候發(fā)現(xiàn)又不通了,++i和i++這個(gè)我知道,但是函數(shù)運(yùn)行上下文又迷糊了。

題一

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

我的理解是:在閉包內(nèi)使用 this 對(duì)象將產(chǎn)生一些復(fù)雜的行為。this 對(duì)象的值基于函數(shù)所在的執(zhí)行環(huán)境在運(yùn)行時(shí)決定:在全局函數(shù)中使用時(shí),this等于 window (非嚴(yán)格模式)或 undefined (嚴(yán)格模式);而當(dāng)作為對(duì)象的方法調(diào)用時(shí), this 等于這個(gè)對(duì)象。解析:比較getNameFunc和getName前者返回的是一個(gè)匿名函數(shù),執(zhí)行環(huán)境是全局,可以進(jìn)行拆分理解object.getName() = function(){return this.name}很明顯這個(gè)的執(zhí)行環(huán)境是全局的。后置的執(zhí)行環(huán)境就object對(duì)象。

題二

遇到這兩個(gè)的時(shí)候,我又漿糊了,大神看看這兩個(gè)該怎樣分析為好?謝謝。

var i = 100;
function foo() {
    var i = 1;
    return function() {
        console.log(i++);
    }
}
 
var f1 = foo(),f2 = foo();
foo()(); //1
f1(); //1
f1(); //2
f2(); //1

var i = 100;
function foo() {
    var i = 1;
    return function() {
        console.log(this.i++);
    }
}
 
var f1 = foo(),f2 = foo();
foo()(); //100
f1(); //101
f1(); //102
f2(); //103
回答
編輯回答
薔薇花

第一段代碼,所有的i都指向foo中定義的i,其中f1/f2/foo()()的i各自獨(dú)立;

第二段代碼,this始終指向window,因此全程都在操作同一個(gè)i,即全局定義的i,初始值100

2018年7月16日 02:37
編輯回答
空白格

第一段代碼,是閉包的理解
1.f1=foo().f2=foo(),foo執(zhí)行環(huán)境初始化,兩個(gè)不同執(zhí)行環(huán)境對(duì)應(yīng)的執(zhí)行變量里i為undefined;
1.foo()()不談,直接執(zhí)行這個(gè)函數(shù),拿到當(dāng)前函數(shù)產(chǎn)生執(zhí)行環(huán)境里i的值1;
2.f1():創(chuàng)建f1()產(chǎn)生了f1()的執(zhí)行環(huán)境,初始時(shí)當(dāng)前活動(dòng)對(duì)象里i為1,全局作用域在foo函數(shù)的作用域鏈下一層,取不到100;
3.f1():f1()再次創(chuàng)建執(zhí)行環(huán)境,函數(shù)執(zhí)行環(huán)境此時(shí)變量i,此時(shí)i為2。
4.f2():創(chuàng)建f2()產(chǎn)生了f2()的執(zhí)行環(huán)境,當(dāng)前活動(dòng)對(duì)象里i為1。
兩個(gè)執(zhí)行環(huán)境,對(duì)應(yīng)里有不同的執(zhí)行變量,互不干擾

第二段
執(zhí)行函數(shù)時(shí),函數(shù)在全局環(huán)境下執(zhí)行,操作的都是全局作用域的i,所以一直累加

2018年6月27日 08:04
編輯回答
傻叼

題一:this 指向調(diào)用它的那個(gè)對(duì)象。object.getNameFunc()() 因?yàn)?object.getNameFunc() 返回的是一個(gè)方法,假設(shè)叫 fun2,等于 fun2(),等于 window.fun2(),所以 this 指向 window。同理 object.getName() this 指向 object。
題二:
第一段代碼 首先 f1 f2 foo() 各自獨(dú)立,執(zhí)行的時(shí)候形成各自的閉包不收影響,是各自作用域中的i,所以 f1 執(zhí)行幾次它對(duì)應(yīng)的 i 加幾次,和 f2 的 i 無(wú)關(guān)。
第二段代碼 參照題一,this 指向 window,而全局的 i 即是 window.i,所以f1() f2() f()() 中的 i 其實(shí)是同一個(gè),就是 window.i

2018年2月23日 10:48