簡體   English   中英

理解 JavaScript 中的閉包作用域

[英]Understanding closure scope in JavaScript

我一直在閱讀“你不懂 JS”系列叢書,我有一個關於閉包的問題。

 var a; function wait() { a = 10; return setTimeout(function timer() { console.log('Hello closure ', a); }, 1000) } const fn = wait; fn(); console.log(a);

如果我在沒有執行函數 (fn()) 的情況下在控制台中詢問a的值,它會說它是未定義的,這是正確的。

現在,如果我在 1 秒后執行函數fn()它將打印Hello Closure 10我知道計時器在等待函數上有一個閉包,這就是它打印該值的原因,即使它是在定義它的詞法范圍之外執行的。

但是如果現在在控制台中打印一個值(在運行 fn() 之后)它也會輸出10 ,所以我想這不是詞法范圍,從全局范圍開始查找永遠不會下降(我的意思是它在嵌套函數中看起來很深) ),它總是向上查找變量(向上到函數的封閉范圍)。

所以我想知道這是否也是閉包,還是在運行函數后變量只是獲得了另一個值,僅此而已?

如果在函數內部實例化該變量,將阻止同名的全局變量發生變化。 我在函數中添加了一個var a = 10 我把全局范圍的變量留在那里,所以你可以看到它現在沒有改變。 這更像是一個可變范圍的問題。

閉包按您的預期工作,只是您設置了一個全局變量。

 var a; function wait() { var a = 10; return setTimeout(function timer() { console.log('Hello closure ', a); }, 1000) } const fn = wait; fn(); console.log(a);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM