鍍金池/ 問答/HTML/ JS 函數(shù)式基礎(chǔ)

JS 函數(shù)式基礎(chǔ)

第一段代碼

var n = 1; //全局變量,作用域為當(dāng)前文檔
function f() {
    var n = 2; //局部變量,作用域僅限于函數(shù)體內(nèi)
    var e = function () { //使用function 語句定義的函數(shù)結(jié)構(gòu)體
        return n; //檢查變量n到底返回什么值
    };
    console.log(e());//2
    return e; //返回函數(shù)結(jié)構(gòu)
}

console.log(f());//調(diào)用外層函數(shù)  調(diào)用f()相當(dāng)于調(diào)用e;
console.log(f()());//調(diào)用外層函數(shù) 調(diào)用f()()相當(dāng)于調(diào)用e();//2

第二段代碼

var n = 1; //全局變量,作用域為當(dāng)前文檔
function f() {
    var n = 2; //局部變量,作用域僅限于函數(shù)體內(nèi)
    var e = new Function("return n;");//使用Function構(gòu)造函數(shù)定義的函數(shù)結(jié)構(gòu)體
    console.log(e());//1
    return e; //返回函數(shù)結(jié)構(gòu)
}

console.log(f());//調(diào)用外層函數(shù)  調(diào)用f()相當(dāng)于調(diào)用e;
console.log(f()());//調(diào)用外層函數(shù) 調(diào)用f()()相當(dāng)于調(diào)用e();//1

第一段和第二段 var e 賦值不一樣,前者把函數(shù)作為直接量賦值給變量,后者是new的構(gòu)造函數(shù),最后兩段代碼結(jié)果不一樣。別分是2和1。我在查閱資料是,有官方解釋是這樣的:因為Function()構(gòu)造函數(shù)定義的函數(shù)作用域需要動態(tài)確定,而不是在定義函數(shù)時確定的。 官方這個解釋我沒明白 這個動態(tài)確定是什么時候確定的,以什么標(biāo)準(zhǔn)來確定的。 哪位經(jīng)驗豐富的朋友分享下,謝謝

回答
編輯回答
莫小染

因為Function()構(gòu)造函數(shù)定義的函數(shù)作用域需要動態(tài)確定,而不是在定義函數(shù)時確定的。
說的挺清楚的
1.定義函數(shù)function關(guān)鍵詞的函數(shù)作用域是詞法即刻確定的
2.Function()構(gòu)造函數(shù)定義的函數(shù)作用域是運行時動態(tài)確定的

2017年12月13日 05:45
編輯回答
懷中人

詞法作用域和動態(tài)作用域,犀牛書寫的很詳細了

clipboard.png

2018年6月22日 05:56