JavaScript的作用域鏈是在函數定義時確定還是在調用時?
問題描述
看到如下的一個閉包問題
var x=10;function fn() { console.log(x);}function show(f) { var x=20; (function() {f(); })();}show(fn);
打印的是10而不是20,x在取值時不是沿著作用域鏈向上尋找嗎,如果作用域鏈是在函數創建時確定結果就是10,如果是在調用時確定就應該是20,有沒有關于作用域鏈準確的說法?這里準確的作用域鏈應該是什么樣的?fn和show處于同一級還是fn在show內?
問題解答
回答1:作用域鏈是在函數定義的時候確定的.
在函數內定義的變量不能在函數之外的任何地方訪問,因為變量僅僅在該函數的域的內部有定義。相對應的,一個函數可以訪問定義在其范圍內的任何變量和函數。換言之,定義在全局域中的函數可以訪問所有定義在全局域中的變量。在另一個函數中定義的函數也可以訪問在其父函數中定義的所有變量和父函數有權訪問的任何其他變量。
https://developer.mozilla.org...
回答2:作用域鏈是動態的,所以,在調用時確定。但是你的這個代碼中,閉包定義的function()是綁定的最外層的作用域function所申明的函數默認是綁定的外層的作用域
(我也是在學習中。。。)
回答3:在函數創建的時候創建一個包含全局變量對象的作用域鏈,儲存在內部[[Scope]]屬性中。函數執行的時候會創建一個執行環境,通過復制[[Scope]]屬性中的對象,構建執行環境的作用域鏈,并把自己的活動對象推入該作用域鏈的前端以此形成完整的作用域鏈。[[Scope]]保存的是對全局變量的引用,而不是值的復制。
var a = 10;function f(){ console.log(a);};function foo(){ a = 20; f();};foo() // 20;回答4:
閉包的調用方式和下面效果等價的,下面舉得例子通過對比說明了,作用域鏈是和函數定義時位置相關的。
var x=10;function fn(){ console.log(x);}function show() { var x=20; fn();}show(); //輸出10-----------------------var x=10;function show() { var x=20; function fn(){console.log(x); } fn();}show(); //輸出20
相關問題鏈接補充。/q/10...。有關于作用域鏈的討論。
回答5:非嚴格模式任何IIFE的this指向都是window
以上文不對題。。。
相關文章:
1. javascript - js 有什么優雅的辦法實現在同時打開的兩個標簽頁間相互通信?2. html5和Flash對抗是什么情況?3. javascript - 怎樣限制同一個瀏覽器不能登錄兩個賬號4. java - 新手做一個安卓視頻播放器,想實現一個進度條,按鈕那種在視頻下方懸浮的功能,不知道思路!5. css3 - Typecho 后臺部分表單按鈕在 Chrome 下出現靈異動畫問題,求解決6. javascript - angular和jquery都用到了$符號,一起用會不會沖突?7. java - android代碼重構:如何把app設置里的頭像UI做成通用的?8. 想找個php大神仿個網站。9. javascript - 一個抽獎的效果(如圖)?10. javascript - jquery怎么給select option一個點擊時觸發的事件,如圖 如果選擇自定義觸發一個時間?
