最近在看js的基礎(chǔ)相關(guān)的知識點(diǎn),在看到閉包和this的時候發(fā)現(xiàn)了問題,哪個大神幫我分析一下,我分析了一下,分析不下去了,第一個我搜了網(wǎng)上的資料,貌似能解釋的清楚,但是看到第二個的時候發(fā)現(xiàn)又不通了,++i和i++這個我知道,但是函數(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 對象將產(chǎn)生一些復(fù)雜的行為。this 對象的值基于函數(shù)所在的執(zhí)行環(huán)境在運(yùn)行時決定:在全局函數(shù)中使用時,this等于 window (非嚴(yán)格模式)或 undefined (嚴(yán)格模式);而當(dāng)作為對象的方法調(diào)用時, this 等于這個對象。解析:比較getNameFunc和getName前者返回的是一個匿名函數(shù),執(zhí)行環(huán)境是全局,可以進(jìn)行拆分理解object.getName() = function(){return this.name}很明顯這個的執(zhí)行環(huán)境是全局的。后置的執(zhí)行環(huán)境就object對象。
遇到這兩個的時候,我又漿糊了,大神看看這兩個該怎樣分析為好?謝謝。
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第一段代碼,是閉包的理解
1.f1=foo().f2=foo(),foo執(zhí)行環(huán)境初始化,兩個不同執(zhí)行環(huán)境對應(yīng)的執(zhí)行變量里i為undefined;
1.foo()()不談,直接執(zhí)行這個函數(shù),拿到當(dāng)前函數(shù)產(chǎn)生執(zhí)行環(huán)境里i的值1;
2.f1():創(chuàng)建f1()產(chǎn)生了f1()的執(zhí)行環(huán)境,初始時當(dāng)前活動對象里i為1,全局作用域在foo函數(shù)的作用域鏈下一層,取不到100;
3.f1():f1()再次創(chuàng)建執(zhí)行環(huán)境,函數(shù)執(zhí)行環(huán)境此時變量i,此時i為2。
4.f2():創(chuàng)建f2()產(chǎn)生了f2()的執(zhí)行環(huán)境,當(dāng)前活動對象里i為1。
兩個執(zhí)行環(huán)境,對應(yīng)里有不同的執(zhí)行變量,互不干擾
第二段
執(zhí)行函數(shù)時,函數(shù)在全局環(huán)境下執(zhí)行,操作的都是全局作用域的i,所以一直累加
題一:this 指向調(diào)用它的那個對象。object.getNameFunc()() 因為 object.getNameFunc() 返回的是一個方法,假設(shè)叫 fun2,等于 fun2(),等于 window.fun2(),所以 this 指向 window。同理 object.getName() this 指向 object。
題二:
第一段代碼 首先 f1 f2 foo() 各自獨(dú)立,執(zhí)行的時候形成各自的閉包不收影響,是各自作用域中的i,所以 f1 執(zhí)行幾次它對應(yīng)的 i 加幾次,和 f2 的 i 無關(guān)。
第二段代碼 參照題一,this 指向 window,而全局的 i 即是 window.i,所以f1() f2() f()() 中的 i 其實是同一個,就是 window.i
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。