作用域鏈 閉包

2021-08-15 10:47:01 字數 1438 閱讀 3847

什麼是閉包?

js語言的特點之一是:內部函式可以訪問全域性變數的值,而外部函式不能訪問內部變數的值。

function test()

b();

}test();//輸出123

反過來,如果a變數在函式b內部的話,test函式是訪問不到的。內層函式實際上可以訪問外部的所有變數的值,在函式內部取值的時候,優先從自己的函式塊中查詢,如果沒有,則返回上一層函式從中查詢,一直到查到全域性變數為止。這樣就形成了乙個作用域鏈。

內部函式改變全域性變數是否對外部函式有影響?

function a()

b();

console.log(aaa);//輸出456

}a();

a函式執行時引起b函式的定義,並且執行了b函式,改變了aaa變數的值,兩次輸出一樣,說明是有影響的,內部函式拿到的外部函式的變數應該指向同乙個位址。

function a()

b();

var aaa="123";

console.log(aaa);//輸出123

}a();

以上執行的結果會讓人誤以為內部函式改變了變數的值對外部函式沒有影響, 在a函式執行的時候,引起b函式的定義,按理說如果有影響,兩次輸出應該都是456,因為內部函式改變了aaa的值,但是b函式執行的時候還沒有aaa變數,之所以能輸出aaa是因為

實際上在js中應該注意的是b函式內部的aaa是乙個未申明就賦值的變數,這個時候aaa屬於全域性變數,歸window所有。

什麼時候生成閉包?

function a()

return b;//返回b以後,a的執行期上下文銷毀,但是b拿到了a的執行期上下文裡面的變數x。

}var c=a();

c();//101

c();//102

c();//103實際上執行的是b函式,將b函式儲存在外面了,每次b執行改變的都是a的執行期上下文裡面的變數

實際上如果將內部函式儲存到外部,一定生成了閉包

。c變數儲存的是b函式,每次對變數的累加其實改變的都是同乙個x

看下面乙個例子:

function test()

}  return arr;//test函式執行完畢時,i==10,內層的匿名函式並沒有執行而是返回到了外部

}var t=test();

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

該段**是乙個經典的閉包,本來按正常應該輸出1到9,實際上在js中,函式一旦沒有執行被儲存到外部,就形成了閉包,這段**中,陣列內部先存了10個匿名函式,分別輸出i,但是卻沒有執行,當第二次用for迴圈執行匿名函式的時候,test函式已經執行完畢,在它的執行期上下文當中存了乙個i=10,這個時候每次實際上都是從外層函式的作用域裡拿到的變數值。

作用域,閉包,作用域鏈

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

作用域 作用域鏈 閉包

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

作用域鏈和閉包

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