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); }
fs[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