JavaScript的作用域鏈?zhǔn)窃诤瘮?shù)定義時確定還是在調(diào)用時?
問題描述
看到如下的一個閉包問題
var x=10;function fn() { console.log(x);}function show(f) { var x=20; (function() {f(); })();}show(fn);
打印的是10而不是20,x在取值時不是沿著作用域鏈向上尋找嗎,如果作用域鏈?zhǔn)窃诤瘮?shù)創(chuàng)建時確定結(jié)果就是10,如果是在調(diào)用時確定就應(yīng)該是20,有沒有關(guān)于作用域鏈準(zhǔn)確的說法?這里準(zhǔn)確的作用域鏈應(yīng)該是什么樣的?fn和show處于同一級還是fn在show內(nèi)?
問題解答
回答1:作用域鏈?zhǔn)窃诤瘮?shù)定義的時候確定的.
在函數(shù)內(nèi)定義的變量不能在函數(shù)之外的任何地方訪問,因?yàn)樽兞績H僅在該函數(shù)的域的內(nèi)部有定義。相對應(yīng)的,一個函數(shù)可以訪問定義在其范圍內(nèi)的任何變量和函數(shù)。換言之,定義在全局域中的函數(shù)可以訪問所有定義在全局域中的變量。在另一個函數(shù)中定義的函數(shù)也可以訪問在其父函數(shù)中定義的所有變量和父函數(shù)有權(quán)訪問的任何其他變量。
https://developer.mozilla.org...
回答2:作用域鏈?zhǔn)莿討B(tài)的,所以,在調(diào)用時確定。但是你的這個代碼中,閉包定義的function()是綁定的最外層的作用域function所申明的函數(shù)默認(rèn)是綁定的外層的作用域
(我也是在學(xué)習(xí)中。。。)
回答3:在函數(shù)創(chuàng)建的時候創(chuàng)建一個包含全局變量對象的作用域鏈,儲存在內(nèi)部[[Scope]]屬性中。函數(shù)執(zhí)行的時候會創(chuàng)建一個執(zhí)行環(huán)境,通過復(fù)制[[Scope]]屬性中的對象,構(gòu)建執(zhí)行環(huán)境的作用域鏈,并把自己的活動對象推入該作用域鏈的前端以此形成完整的作用域鏈。[[Scope]]保存的是對全局變量的引用,而不是值的復(fù)制。
var a = 10;function f(){ console.log(a);};function foo(){ a = 20; f();};foo() // 20;回答4:
閉包的調(diào)用方式和下面效果等價的,下面舉得例子通過對比說明了,作用域鏈?zhǔn)呛秃瘮?shù)定義時位置相關(guān)的。
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
相關(guān)問題鏈接補(bǔ)充。/q/10...。有關(guān)于作用域鏈的討論。
回答5:非嚴(yán)格模式任何IIFE的this指向都是window
以上文不對題。。。
相關(guān)文章:
1. python - 為什么正常輸出中文沒有亂碼,zip函數(shù)之后出現(xiàn)中文編程unicode編碼的問題,我是遍歷輸出的啊。2. 對mysql某個字段監(jiān)控的功能3. showpassword里的this 是什么意思?代表哪個元素4. mysql優(yōu)化 - mysql EXPLAIN之后怎么看結(jié)果進(jìn)行優(yōu)化 ?5. html - vue項目中用到了elementUI問題6. JavaScript事件7. javascript - 原生canvas中如何獲取到觸摸事件的canvas內(nèi)坐標(biāo)?8. css3 - border-bottom 的長度可否超過盒子的寬度呢?實(shí)現(xiàn)如下圖效果。(我的書下面的線)9. css3 - css怎么實(shí)現(xiàn)圖片環(huán)繞的效果10. mysql scripts提示 /usr/bin/perl: bad interpreter
