国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

JavaScript的作用域鍊是在函數(shù)定義時決定還是在呼叫時?
歐陽克
歐陽克 2017-07-05 10:42:15
0
5
1393

看到如下的一個閉包問題

var x=10;
function fn() {
    console.log(x);
}

function show(f) {
    var x=20;

    (function() {
        f();
    })();
}
show(fn);

列印的是10而不是20,x在取值時不是沿著作用域鏈向上尋找嗎,如果作用域鍊是在函數(shù)建立時確定結(jié)果就是10,如果是在呼叫時確定就應(yīng)該是20 ,有沒有關(guān)於作用域鏈準確的說法?這裡準確的作用域鏈應(yīng)該是什麼樣的呢? fn和show處於同等級還是fn在show內(nèi)?

歐陽克
歐陽克

溫故而知新,可以為師矣。 博客:www.ouyangke.com

全部回覆(5)
學(xué)霸

作用域鏈是在函數(shù)定義的時候確定的.

在函數(shù)內(nèi)定義的變數(shù)不能在函數(shù)之外的任何地方訪問,因為變數(shù)僅在該函數(shù)的域的內(nèi)部有定義。相對應(yīng)的,一個函數(shù)可以存取定義在其範(fàn)圍內(nèi)的任何變數(shù)和函數(shù)。換言之,定義在全域域中的函數(shù)可以存取所有定義在全域域中的變數(shù)。在另一個函數(shù)中定義的函數(shù)也可以存取在其父函數(shù)中定義的所有變數(shù)和父函數(shù)有權(quán)存取的任何其他變數(shù)。

https://developer.mozilla.org...

習(xí)慣沉默

作用域鍊是動態(tài)的,所以,在呼叫時確定。
但是你的這個程式碼中,閉包定義的function()是綁定的最外層的作用域
function所申明的函數(shù)預(yù)設(shè)是綁定的外層的作用域

(我也是在學(xué)習(xí)中。。)

洪濤

在函數(shù)創(chuàng)建的時候創(chuàng)建一個包含全域變數(shù)物件的作用域鏈,儲存在內(nèi)部[[Scope]]屬性中。函數(shù)執(zhí)行的時候會創(chuàng)造一個執(zhí)行環(huán)境,透過複製[[Scope]]屬性中的對象,建構(gòu)執(zhí)行環(huán)境的作用域鏈,並把自己的活動對象推入該作用域鏈的前端以此形成完整的作用域鏈。 [[Scope]]保存的是對全域變數(shù)的引用,而不是值的複製。

var a = 10;
function f(){
    console.log(a);
};
function foo(){
    a = 20;
    f();
};
foo() // 20;
阿神

閉包的呼叫方式和下面效果等價的,下面舉得例子透過對比說明了,作用域鍊是和函數(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)問題連結(jié)補充。 /q/10...。有關(guān)於作用域鏈的討論。

扔個三星炸死你

非嚴格模式任何IIFE的this指向都是window

以上文不對題。 。 。

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板