摘要:作用域是最重要的概念之一,想要學好就需要理解作用域和作用域鏈的工作原理。腳本錯誤腳本錯誤由此可以引發作用域鏈的概念在中,函數也是對象,實際上,里一切都是對象。當一個函數創建后,它的作用域鏈會被創建此函數的作用域中可訪問的數據對象填充。
作用域是JavaScript最重要的概念之一,想要學好JavaScript就需要理解JavaScript作用域和作用域
鏈的工作原理。
1. 全局作用域(Global Scope)(1)最外層函數和在最外層函數外面定義的變量擁有全局作用域,例如:
var authorName="Jessica"; function doSomething(){ var blogName="mengera88"; function innerSay(){ alert(blogName); } innerSay(); } alert(authorName); //Jessica alert(blogName); //腳本錯誤 doSomething(); //mengera88 innerSay() //腳本錯誤
(2)所有末定義直接賦值的變量自動聲明為擁有全局作用域,例如:
function doSomething(){ var authorName="Jessica"; blogName="mengera88"; alert(authorName); } doSomething(); //Jessica alert(blogName); //mengera88 alert(authorName); //腳本錯誤
變量blogName擁有全局作用域,而authorName在函數外部無法訪問到。
(3)所有window對象的屬性擁有全局作用域
一般情況下,window對象的內置屬性都擁有全局作用域,例如window.name、window.location、window.top等等。
2.局部作用域和全局作用域相反,局部作用域一般只在固定的代碼片段內可訪問到,最常見的例如函數內部,所有在 一些地方也會看到有人把這種作用域稱為函數作用域,例如下列代碼中的blogName和函數innerSay都 只擁有局部作用域。
function doSomething(){ var blogName="Jessica"; function innerSay(){ alert(blogName); } innerSay(); } alert(blogName); //腳本錯誤 innerSay(); //腳本錯誤
由此可以引發作用域鏈的概念:
在JavaScript中,函數也是對象,實際上,JavaScript里一切都是對象。函數對象和其它對象一樣,擁有可以通過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內部屬性。其中一個內部屬性是[[Scope]],由ECMA-262標準第三版定義,該內部屬性包含了函數被創建的作用域中對象的集合,這個集合被稱為函數的作用域鏈,它決定了哪些數據能被函數訪問。
當一個函數創建后,它的作用域鏈會被創建此函數的作用域中可訪問的數據對象填充。例如定義下面這樣一個函數:
function add(num1,num2) { var sum = num1 + num2; return sum; }
在函數add創建時,它的作用域鏈中會填入一個全局對象,該全局對象包含了所有全局變量,函數add的作 用域將會在執行時用到。例如執行如下代碼:
var total = add(5,10);
執行此函數時會創建一個稱為“運行期上下文(execution context)”的內部對象,運行期上下文定義 了函數執行時的環境。每個運行期上下文都有自己的作用域鏈,用于標識符解析,當運行期上下文被創 建時,而它的作用域鏈初始化為當前運行函數的[[Scope]]所包含的對象。
這些值按照它們出現在函數中的順序被復制到運行期上下文的作用域鏈中。它們共同組成了一個新的對象,叫“活動對象(activation object)”,該對象包含了函數的所有局部變量、命名參數、參數集合以及this,然后此對象會被推入作用域鏈的前端,當運行期上下文被銷毀,活動對象也隨之銷毀。
在函數執行過程中,每遇到一個變量,都會經歷一次標識符解析過程以決定從哪里獲取和存儲數據。 該過程從作用域鏈頭部,也就是從活動對象開始搜索,查找同名的標識符, 如果找到了就使用這個標識符對應的變量,如果沒找到繼續搜索作用域鏈中的下一個對象, 如果搜索完所有對象都未找到,則認為該標識符未定義。函數執行過程中,每個標識符都要經歷 這樣的搜索過程。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85880.html
摘要:之前一篇文章我們詳細說明了變量對象,而這里,我們將詳細說明作用域鏈。而的作用域鏈,則同時包含了這三個變量對象,所以的執行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當前的函數調用棧,為當前正在被執行的函數的作用域鏈,為當前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學JavaScrip...
摘要:作用域是最重要的概念之一,想要學好就需要理解作用域和作用域鏈的工作原理。腳本錯誤腳本錯誤由此可以引發作用域鏈的概念在中,函數也是對象,實際上,里一切都是對象。當一個函數創建后,它的作用域鏈會被創建此函數的作用域中可訪問的數據對象填充。 作用域是JavaScript最重要的概念之一,想要學好JavaScript就需要理解JavaScript作用域和作用域 鏈的工作原理。 1. 全局作...
摘要:作用域是最重要的概念之一,想要學好就需要理解作用域和作用域鏈的工作原理。腳本錯誤腳本錯誤由此可以引發作用域鏈的概念在中,函數也是對象,實際上,里一切都是對象。當一個函數創建后,它的作用域鏈會被創建此函數的作用域中可訪問的數據對象填充。 作用域是JavaScript最重要的概念之一,想要學好JavaScript就需要理解JavaScript作用域和作用域 鏈的工作原理。 1. 全局作...
摘要:在的開發者工具中,通過斷點調試,我們能夠非常方便的一步一步的觀察的執行過程,直觀感知函數調用棧,作用域鏈,變量對象,閉包,等關鍵信息的變化。其中表示當前的局部變量對象,表示當前作用域鏈中的閉包。 showImg(https://segmentfault.com/img/remote/1460000008404321); 在前端開發中,有一個非常重要的技能,叫做斷點調試。 在chrome...
摘要:圖片中的作用域鏈,是全局執行環境中的作用域鏈。然后此活動對象被推入作用域鏈的最前端。在最后調用的時候,創建先構建作用域鏈,再創建執行環境,再創建執行環境的時候發現了一個變量標識符。 從圖書館翻過各種JS的書之后,對作用域/執行環境/閉包這些概念有了一個比較清晰的認識。 栗子說明一切 第一個栗子 來看一個來自ECMA-262的栗子: var x = 10; (function foo(...
閱讀 1329·2021-09-04 16:40
閱讀 3455·2021-07-28 00:13
閱讀 2878·2019-08-30 11:19
閱讀 2611·2019-08-29 12:29
閱讀 3167·2019-08-29 12:24
閱讀 1122·2019-08-26 13:28
閱讀 2386·2019-08-26 12:01
閱讀 3445·2019-08-26 11:35