国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

JavaScript的作用域鏈是在函數定義時確定還是在調用時?

瀏覽:82日期:2023-04-01 14:03:35

問題描述

看到如下的一個閉包問題

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

以上文不對題。。。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 美女视频黄a视频免费全程 美女视频黄a视频免费全过程 | 欧美日本一区亚洲欧美一区 | 欧美日韩一区二区视频免费看 | 国产成人免费视频 | 免费成年人视频网站 | 玖玖这里只有精品 | 毛片免费在线观看 | 日韩人成 | 欧美成a人免费观看久久 | 日韩一区二区在线播放 | 亚洲精品久久久久综合91 | 神马午夜-午夜片 | 国产精品麻豆一区二区三区v视界 | www.av网| 色三级大全高清视频在线观看 | 国产真实自拍 | 精品国产96亚洲一区二区三区 | 男吃女下面刺激视频免费 | 5级做人爱c视版免费视频 | 97精品国产综合久久久久久欧美 | 久久福利资源国产精品999 | 日韩不卡一区二区三区 | 欧美精品亚洲人成在线观看 | 亚洲欧美日韩精品久久亚洲区色播 | 天天看片天天爽_免费播放 天天看夜夜 | 国产日韩欧美久久久 | re久久 | 欧美日韩一区二区三区视频 | 欧美精品18videos性欧美 | 亚欧免费视频 | 久久semm亚洲国产 | 国产一级毛片夜一级毛片 | 欧美另类69xxxxx极品 | 午夜天堂视频 | 日本精品久久久久中文字幕 1 | 免费在线观看毛片 | 精品一区二区三区视频在线观看 | 国产自愉自愉全免费高清 | 国产在线观看一区二区三区 | 国产精品网址 | 97高清国语自产拍中国大陆 |