摘要:關(guān)于作用域?qū)崿F(xiàn)的描述任何執(zhí)行上下文時(shí)刻的作用域,都是由作用域鏈來(lái)實(shí)現(xiàn)的。在一個(gè)函數(shù)被定義的時(shí)候,會(huì)將它此時(shí)的作用域鏈鏈接到這個(gè)函數(shù)對(duì)象的屬性。參考資料鳥哥作用域原理理解作用域和作用域鏈阮一峰老師微博上的關(guān)于作用域的一道題
javascript作用域原理學(xué)習(xí)
在每次調(diào)用一個(gè)函數(shù)的時(shí)候,就會(huì)進(jìn)入一個(gè)函數(shù)內(nèi)的作用域,當(dāng)從函數(shù)返回
以后,就會(huì)返回調(diào)用前的作用域。
ECMA262關(guān)于作用域?qū)崿F(xiàn)的描述:
任何執(zhí)行上下文時(shí)刻的作用域,都是由作用域鏈(scope chain)來(lái)實(shí)現(xiàn)的。
在一個(gè)函數(shù)被定義的時(shí)候,會(huì)將它此時(shí)的作用域鏈鏈接到這個(gè)函數(shù)對(duì)象的[[scope]]屬性。
在一個(gè)函數(shù)被調(diào)用時(shí),會(huì)創(chuàng)建一個(gè)活動(dòng)對(duì)象,然后對(duì)于函數(shù)的每一個(gè)形參,都命名為該活動(dòng)對(duì)象的命名屬性,然后將這個(gè)活動(dòng)對(duì)象做為此時(shí)的作用域鏈最前端,并將這個(gè)函數(shù)的[[scope]]屬性加入到作用域鏈中。
用例子說(shuō)明。來(lái)自鳥哥的博客;
function factory() { var name = "Elric"; var intro = function(){ alert("I am " + name); } return intro; } function app(para){ var name = para; var func = factory(); func(); } app("eva");
我是這么理解的:
因?yàn)?/p>
JavaScript中的函數(shù)運(yùn)行在它們被定義的作用域里,而不是它們被執(zhí)行的作用域里.
所以,intro的作用域鏈應(yīng)該是 intro --> factory --> window
當(dāng)調(diào)用進(jìn)入到intro時(shí),對(duì)name的查找不會(huì)進(jìn)入app的作用域,所以輸出的值是Elric
再來(lái)一個(gè)例子。來(lái)自阮一峰老師的微博;
function a(x, y) { y = function(){ x = 2; }; return function() { var x = 3; y(); console.log(x); }.apply(this, arguments); } a();// 3
我是這么理解的:
按照定義來(lái),return的匿名函數(shù)的作用域鏈應(yīng)該是[[scope]] --> a -->window
所以,在調(diào)用的時(shí)候,它最先找到的是自己的x的值,而執(zhí)行y,修改的是a中的x的值。
如果把代碼改成:
function a(x, y) { var x = 1; y = function() { x = 2; }; return function() { y(); console.log(x); }.apply(this, arguments); } a();// 2
這里輸出的本來(lái)應(yīng)該是1,但是!但是執(zhí)行了y,y把a(bǔ)中的x修改成2.因?yàn)閥的作用域鏈?zhǔn)莥 -->a -->window;
然后,在segmentfault上看到的
function a(x, y) { var name = 1; y = function() { x = 2; }; return function() { var name = 3; y(); console.log(this.x); }.apply(this, arguments); } a();// undefined
我簡(jiǎn)單的理解為,這里的this.x相當(dāng)于window.x。所以是undefined。
總結(jié):
JavaScript中的函數(shù)運(yùn)行在它們被定義的作用域里,而不是它們被執(zhí)行的作用域里.
從定義出發(fā)去分析函數(shù)的作用域,而不是通過(guò)調(diào)用的順序。
參考資料
1.鳥哥:Javascript作用域原理
2.理解 JavaScript 作用域和作用域鏈
3.阮一峰老師微博上的關(guān)于js作用域的一道題
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85692.html
摘要:對(duì)象有狀態(tài)對(duì)象具有狀態(tài),同一對(duì)象可能處于不同狀態(tài)之下。中對(duì)象獨(dú)有的特色對(duì)象具有高度的動(dòng)態(tài)性,這是因?yàn)橘x予了使用者在運(yùn)行時(shí)為對(duì)象添改狀態(tài)和行為的能力。小結(jié)由于的對(duì)象設(shè)計(jì)跟目前主流基于類的面向?qū)ο蟛町惙浅4螅瑢?dǎo)致有不是面向?qū)ο筮@樣的說(shuō)法。 筆記說(shuō)明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過(guò)程的一些...
摘要:對(duì)象有狀態(tài)對(duì)象具有狀態(tài),同一對(duì)象可能處于不同狀態(tài)之下。中對(duì)象獨(dú)有的特色對(duì)象具有高度的動(dòng)態(tài)性,這是因?yàn)橘x予了使用者在運(yùn)行時(shí)為對(duì)象添改狀態(tài)和行為的能力。小結(jié)由于的對(duì)象設(shè)計(jì)跟目前主流基于類的面向?qū)ο蟛町惙浅4?,?dǎo)致有不是面向?qū)ο筮@樣的說(shuō)法。 筆記說(shuō)明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過(guò)程的一些...
摘要:對(duì)象有狀態(tài)對(duì)象具有狀態(tài),同一對(duì)象可能處于不同狀態(tài)之下。中對(duì)象獨(dú)有的特色對(duì)象具有高度的動(dòng)態(tài)性,這是因?yàn)橘x予了使用者在運(yùn)行時(shí)為對(duì)象添改狀態(tài)和行為的能力。小結(jié)由于的對(duì)象設(shè)計(jì)跟目前主流基于類的面向?qū)ο蟛町惙浅4螅瑢?dǎo)致有不是面向?qū)ο筮@樣的說(shuō)法。 筆記說(shuō)明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過(guò)程的一些...
摘要:基本的學(xué)習(xí)思路是跟著框架設(shè)計(jì)這本書,甚至可以說(shuō)是這本書的讀書筆記。也參考很多網(wǎng)上解讀的博客和學(xué)習(xí)資料。當(dāng)然,最重要的資料還是框架的源代碼。后來(lái)由于開發(fā)者反對(duì),新興的框架都在命名空間上構(gòu)建。 JavaScript框架學(xué)習(xí)筆記(一) 我為什么要學(xué)習(xí)框架 更深入的理解工具,以后用起來(lái)更順手而且也能做一定的工具取舍,學(xué)習(xí)理解新工具也就更快, 對(duì)提升js水平也很有幫助,框架有很多解決坑的經(jīng)典思...
摘要:在上百種語(yǔ)言中算是命好的一個(gè),還有就是最近納入高考體系的。由以下三個(gè)部分構(gòu)成。就是對(duì)實(shí)現(xiàn)該標(biāo)準(zhǔn)規(guī)定的各個(gè)方面內(nèi)容的語(yǔ)言的描述。是針對(duì)但經(jīng)過(guò)擴(kuò)展的用于的應(yīng)用程序編程接口。將頁(yè)面映射為由節(jié)點(diǎn)構(gòu)成的樹狀結(jié)構(gòu)。 JavaScript的歷史這里就不再贅述了,當(dāng)然JavaScript的歷史還是比較有意思的。在上百種語(yǔ)言中JavaScript算是‘命’好的一個(gè),還有就是最近納入高考體系的python...
閱讀 3572·2021-11-25 09:43
閱讀 3149·2021-10-08 10:04
閱讀 1639·2019-08-26 12:20
閱讀 2069·2019-08-26 12:09
閱讀 612·2019-08-23 18:25
閱讀 3588·2019-08-23 17:54
閱讀 2341·2019-08-23 17:50
閱讀 816·2019-08-23 14:33