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

鍍金池/ 問答/HTML/ 一道前端面試題的疑問

一道前端面試題的疑問

原題目是這樣的:

求輸出值

var i = 10;
function foo () {
    console.log(i)
}
(function (fn) {
    var i = 20
    fn()
})(foo)

結(jié)果是10,為什么不是20呢,根據(jù)作用域鏈,傳進(jìn)來的這個foo函數(shù)在執(zhí)行 console.log(i) 時,不是應(yīng)該先在這個塊級作用域里找變量 i 的值嗎?

我在chrome控制臺又寫了這樣一段類似的代碼:

var i = 10;
(function () {
    var i = 20;
    (function () {
        console.log(i)    
        })()
})()

不過這次輸出了20,我的疑問是,同樣是在一個閉包中執(zhí)行的 console.log(i) ,面試題中是匿名函數(shù)作為參數(shù)傳入,能不能幫我分析一下兩者的不同。。。

這個問題對很多人來講應(yīng)該挺初級的,但是我就是一時想不明白了,還望大神們給個詳細(xì)的分析,菜鳥在此謝過了。

回答
編輯回答
傲寒

作用域鏈?zhǔn)锹暶鲿r確定的。并不是執(zhí)行時確定的。

2018年8月29日 08:40
編輯回答
情已空

函數(shù)的作用域在聲明時就已經(jīng)確定了,不是在調(diào)用的時候確定的

2017年8月29日 06:53
編輯回答
離殤

在運(yùn)行之前會先生成作用域鏈。從上到下一行行解析后,foo的作用域鏈中,i是指向最外層的那個i = 10的,你在立即執(zhí)行函數(shù)中執(zhí)行的foo已經(jīng)規(guī)定好i是指向最外層的i了。
理解JavaScript的作用域鏈

2018年6月21日 05:02
編輯回答
玩控

這是一個作用域鏈的問題。記住一個最為重要的特性:函數(shù)在創(chuàng)建時刻靜態(tài)的保存了父級所有的,參數(shù)+函數(shù)聲明+變量聲明。需要注意的是:創(chuàng)建時刻,從該位置算起。
第一個foo是在全局聲明的,它的作用域鏈上只有 i=10;
第二個匿名函數(shù)自執(zhí)行,它的作用域鏈上有i= 20;和i= 10;訪問i=20要比訪問i=10的優(yōu)先級高,所以第二個顯示20;
第一個還有一個變形:
var i = 10;
(function (fn) {

var i = 20
fn()

})(function foo () {

console.log(i)

})

函數(shù)的參數(shù)只是接受,不創(chuàng)建。
詳細(xì)說明,AO ,VO ,閉包,作用域鏈,原型等可以參考 http://dmitrysoshnikov.com/
其中ECMA-262-3 in detail 和ECMA-262-5 in detail系列有詳細(xì)說明

2017年10月24日 19:30