最近在看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
第一段代碼,是閉包的理解
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,所以一直累加
題一: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
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。