一個考察閉包的最基礎的面試題

fs=[];
for(var x=0;x<5;x++){
    fs[x]=function(){
        console.log(x);
    }
}
fs[2]();

上面代碼輸出是5,若是但願輸出是2面試

在我剛入行那個年代,這題目想考察的必定是閉包,以下:閉包

fs = [];
for (var x = 0; x < 5; x++) {
    (function(x) {
        fs[x] = function() {
            console.log(x);
        }
    })(x);
}
f
s[2]();

可是,2016年開始,ES6成了面試必問套路。在ES6裏面,多了一個答案,以下:函數

fs=[];
for(let x=0;x<5;x++){
    fs[x]=function(){
        console.log(x);
    }
}
fs[2]();

即 var 改成let,利用了ES6裏的塊級做用域。spa

今天,看一篇文章,忽然看到了另一個方案,這方案是ES5就支持的with,以下:code

fs = [];
for (var x = 0; x < 5; x++) {
    with({ x: x }) {
        fs[x] = function() {
            console.log(x);
        }
    }
}
fs[2]();

先不說是否優雅,以前無論是別人面試我仍是我面試別人,還真沒想到過能夠用with加個object變量來作,每一次for循環都建立了新的object引用,天然每次循環建立函數的時候,就都是新的索引了。blog

相關文章
相關標籤/搜索