首頁  >  文章  >  web前端  >  基礎的JavaScript知識總結(九)作用域​​、作用域鏈精解

基礎的JavaScript知識總結(九)作用域​​、作用域鏈精解

php中世界最好的语言
php中世界最好的语言原創
2018-03-10 13:36:321333瀏覽

這次帶給大家基礎的JavaScript知識總結,總共有十一個知識點,基礎的JavaScript知識總結(九)作用域​​、作用域鏈精解下面就是實戰案例,一起來看一下。

作用域精簡

[[scope]] : 每個JavaScript函數都是一個物件。物件中有些屬性我們可以訪問,但有些不可以,這些屬性只提供JavaScript引擎訪問,[[scope]]就是其中一個。

[[scope]]指的就是我們所說的作用域,其中儲存了運行期上下文的集合

作用域鏈: [[scope]]中儲存的執行期上下文物件的集合,這個集合呈現鍊式鏈接,我們把這種鍊式連結叫做作用域鏈

運行期上下文: 當函數執行時,會建立一個稱為執行期上下文的內部對象。一個執行期上下文定義了一個函數執行時的環境,函數每次執行時對應的執行上下文都是獨一無二的,所以多次呼叫一個函數會導致創建多個執行期上下文,當函數執行完畢,它所產生的執行上下文被銷毀

查找變數: 從作用域鏈的頂端依序向下查找

function a() {    function b(){        var b = 234;
    }    
    var a = 123;
    b();
}var glob = 100;
a();

首先我們來看上面的函數,這個是個整體的函數,a在這個全域的作用域裡面,然後下面有glob這個變數,然後有這個a執行;

第一步: 首先系統看到的肯定是這個a定義,a定義的話有這個[[scope]]。

a
/
[[scope]]    
scope指向scope chain
scope chain
scope指向这里


0  這個位置的0指向GO    


Global Object

#0指向的是這個表格

this    window    
window    (object)    
document    (object)    
a    (function)    
glob    100    
[[scope]]里面有这个全局的执行期上下文,然后a被执行了,a被执行,a产生的这个AO,把自己的AO存到作用域链的最顶端,形成一个新的作用域链,现在的a的[[scope]]和刚才的那个[[scope]]不一样了
a
/
[[scope]]
scope指向scope chain
scope chain
scope指向这里


0  這個位置的0指向AO    

1  這個位置的0指向GO    


##Activation  Object

0指向的是這個表

this    window    
arguents    []    
a    123    
b    (function)    
Global Object

1指向的是這個表

this    window    
window    (object)    
document    (object)    
a    (function)    
glob    100

它的不一樣只是裡面存的值不一樣了[ [scope]]還是那個[[scope]],這時候我們不看下面,這個時候假如我們訪問一個變數的話,我們訪問的是a的[[scope]],是從a的[[scope]]裡面拿東西,a的scope是一個倉庫,這個庫裡面存了個作用域鏈,裡面掛了各種變量,我去裡面拿東西的時候,就置頂向下去找。

然後a的執行,產生了b被定義,a執行了b才能被定義,b被定義的時候有個天生的[[scope]],[[scope]]裡面存了一個它所應該有的作用域鏈,但是它有的作用域鍊和a的不一樣,a被定義的時候,是在全局裡面,所能返訪問的屬性也只有它自己的AO還有全局的GO,但b是在a函數裡面定義的,所以b的[[scope]]不但可以存取自己的AO,也可以存取到a的AO,還有全域的GO

b
/
[[scope]]

scope指向scope chain

scope chain

scope指向這裡

0  這個位置的0指向自己的AO    

1  這個位置的1指向的a的AO    

2  這個位置的0指向GO    

Activation  Object

0指向的是這個表

this    window    
arguents    []    
b    234;    
Activation  Object

1指向的是這個表

this    window    
arguents    []    
a    123    
b    (function)    
Global Object

#1指向的是這個表

this    window    
window    (object)    
document    (object)    
a    (function)    
glob    100

作用域銷毀

當b執行完之後,銷毀自己的ao,回到定義狀態,等待下次被執行

因為b是函數a的最後一句,所以當b執行完之後,a也銷毀掉這麼連帶著b的[[scope]]也被銷毀,回到定義狀態,等待下次被執行

//例子function a() {    function b() {        function c(){
            
        }
        c();
    }
    b();
}
a();
a defined a.[[scope]] --> 0:GOa doing   a.[[scope]] --> 0:a的AO
                          1:GO
                          b defined b.[[scope]] --> 0:a的AO
                          1:GOb doing   b.[[scope]] --> 0:自己的AO
                          1:a的AO 
                          2:GO
                          c defined c.[[scope]] --> 0:a的AO
                          1:c的AO 
                          2:GOc doing   c.[[scope]] --> 0:自己的AO
                          1:b的AO
                          2:a的AO
                          3:GO
所以外部函數訪問不到

內部函數

的屬性和值

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

相關閱讀:
基礎的JavaScript知識總結(六)函數、初始作用域(下)


基礎的JavaScript知識總結(七)遞歸


基礎的JavaScript知識總結(八)預編譯執行過程

######

以上是基礎的JavaScript知識總結(九)作用域​​、作用域鏈精解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn