在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ 沒(méi)寫var的情況下, fn2相當(dāng)于全局函數(shù),但是可以讀取局部變量?

沒(méi)寫var的情況下, fn2相當(dāng)于全局函數(shù),但是可以讀取局部變量?

var fn1 = function(){

var a=1
alert(a)
fn2=function(){

  console.log(a);

}
}
fn1();
fn2();
這樣的話全局的fn2,讀取用到了局部函數(shù)fn1的var a=1?不符合作用域鏈啊?

回答
編輯回答
吢涼

函數(shù)fn2就被包括在函數(shù)fn1內(nèi)部,這時(shí)fn1內(nèi)部的所有局部變量,對(duì)fn2都是可見(jiàn)的,但是對(duì)于fn2來(lái)說(shuō)是改變不了fn1任何局部變量的值的。
同時(shí)fn2內(nèi)部的局部變量,對(duì)fn1是不可見(jiàn)的。這就是Javascript語(yǔ)言特有的“鏈?zhǔn)阶饔糜颉苯Y(jié)構(gòu)(chain scope),子對(duì)象會(huì)一級(jí)一級(jí)地向上尋找所有父對(duì)象的變量。
所以,父對(duì)象的所有變量,對(duì)子對(duì)象都是可見(jiàn)的,反之則不成立。

var fn2; // 此時(shí)fn2為undefined

var fn1 = function () {

        var a = 1
        // alert(a)
        // 重新定義fn2為一個(gè)函數(shù),因此可以在外部調(diào)用fn2
        fn2 = function () {
            a = 4;
            console.log('fn2',a);
            fn1();
        }

        console.log('fn1',a);
    }

    fn1();
    fn2();
2018年3月28日 02:36
編輯回答
玄鳥

這個(gè)其實(shí)相當(dāng)于是閉包,fn2可以理解為全局的變量被賦為一個(gè)函數(shù),其實(shí)可以這么理解:

// 這里有一個(gè)fn2,被賦值為`function() {console.log(a)}`

var fn1 = function(){

    var a=1
    alert(a)
    fn2=function(){
    
        console.log(a);
    }
}
fn1();
fn2(); 

而JavaScript是靜態(tài)作用域,也就是作用域是在定義的時(shí)候就確定了的。

所以是符合作用域鏈的。

2018年2月15日 19:06