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