簡述JS作用域 作用域鏈和閉包

2021-07-27 03:49:07 字數 1512 閱讀 6892

定義:乙個變數的作用域是程式源**中定義這個變數的區域。

全域性變數擁有全域性作用域,區域性變數只有區域性作用域。

塊級作用域: 在es6 let變數宣告出來之前,js是沒有塊級作用域的概念的,函式內部定義的變數才是區域性變數,具體見下面的**

var a=1;

for(var i=0;i<10;i++)

function

f(x)

console.log(a);//1

console.log(b);//1

console.log(x);//not defined

由於沒有塊級作用域,for迴圈結束後b也不會被銷毀,是全域性變數,而x由於是在函式內部,函式執行完即被銷毀,只在函式內部可見,因此訪問不到。

本質: 乙個指向變數物件的指標列表。這些變數物件都能被當前**(全域性**或函式)訪問。

變數物件: 作用域鏈始終擁有乙個全域性物件,包含所有的全域性變數和函式。當函式被呼叫時會建立乙個執行環境,使用arguments和其他命名引數值來初始化函式的活動物件(作為變數物件),如下面的**

var a=1;

var x=2;

function

f(x)

console.log(f(a));// 1

當函式f被執行時活動物件為arguments:[ 1 ] x: 1,全域性物件包含a x f及其他全域性變數和函式。

此時的f(a)的作用域鏈由f自身的活動物件和全域性物件組成,當需要查詢變數x時,先從活動物件開始查詢,如果找不到則查詢全域性物件。

當函式被建立時,若函式是全域性函式,則建立乙個預先包含全域性物件的作用域鏈,若函式是內部函式,則將外部函式的作用域鏈作為初始作用域鏈。還是看**:

var a=2;

functionf()

}f();

console.log(f2());//2

首先看執行f(a)時f的作用域鏈:活動物件(arguments b)-> 全域性物件 (a f f2),

執行f(a)時同時也建立了函式f2,此時f2的作用域鏈為: f的活動物件(arguments b)-> 全域性物件 (a f f2),

執行f2(b)時建立了f2的活動物件(arguments)並將其推入到作用域鏈的頂端,此時f2的作用域鏈為: f2的活動物件(arguments)->f的活動物件(arguments b)-> 全域性物件 (a f f2),

當查詢b時,由於本地活動物件中沒有,因此向上層查詢,在f的活動物件中找到了b變數。

理解了作用域鏈之後,其實閉包就比較好理解了。

閉包指有權訪問另乙個函式作用域中變數的函式。

建立閉包的常見方式就是在乙個函式內部建立另外乙個函式,仍以前面的函式為例:

var a=2;

functionf()

}f();

console.log(f2());//2

我們在f中建立了乙個函式f2,使得f2能夠訪問f中的變數,此時f2就是閉包。

作用域,閉包,作用域鏈

一,作用域 變數在宣告它的函式及該函式所巢狀的任意函式是有定義的 例var num 2 function fun fun 二,作用域鏈 多個函式巢狀在一起,多個作用域相互巢狀,這是作用域鏈 var num 1 function fun function fun2 fun1 fun2 fun 訪問原則...

作用域 作用域鏈 閉包

閉包概念中的一些專業名詞概念不清晰 作用域鏈 本質是乙個指向變數物件的指標列表。函式的作用域鏈在函式呼叫完成後即被銷毀。變數物件 全域性變數物件 js執行時一直存在 活動變數物件 區域性變數物件,函式執行完畢後銷毀 函式在呼叫時建立本地的活動物件加上函式定義時預建立的作用域鏈,形成乙個新的用於執行函...

作用域鏈和閉包

一.作用域鏈 scope chain 1.作用域 函式作用域 scope 外部對內部可見 內部對外部不可見 內部優先 js中只有函式級別的作用域,沒有塊級別的作用域 換句話說,只有在進入或者退出函式的時候,作用域會發生變化 2.執行環境 ec 和作用域鏈 執行環境,定義了執行期間可以訪問的變數和函式...