題目:
var funcs =
for (var i = 0; i < 10; i++) )
}funcs.foreach(function(func) )
這題輸出多少呢?
答案:十個10。
為什麼?
當然了,不排除已經會的童鞋了,如果會的話,請關閉這篇博文,不然只會浪費時間。如果不會,那麼請務必好好看看。
回答之前,我們再看看這道題變化後輸出是什麼樣子的:
var funcs = ;
for (var i = 0; i < 10; i++) )
console.log(funcs[i]());
}funcs.foreach(function(func) )
那麼這道題的列印的又是些什麼值呢?
答案:0.1.2.3.4.5.6.7.8.9和十個10.
為什麼呢?
其實大家把兩段**用瀏覽器即可驗證出來了,細心的同學甚至就知道為什麼了。
下面我把兩段**在瀏覽器中列印的值的圖放出來:
1.首先,函式或者說方法只有在呼叫的是時候才會執行其內部語句,否則相當於只定義了乙個方法,這裡舉個栗子:
這裡我在裡面定義了乙個名為test的函式,但是裡面的變數tested根本就未定義,但是在瀏覽器中是不會報錯的,但只要我們呼叫了這個函式,那麼瀏覽器會報錯:
2. 知道之後,我們便可知原題中,由於funcs陣列push進去了十個匿名函式,但由於尚未呼叫,所以裡面的i並未列印出來,但是實質上裡面的i的確是0,1,2,3,4,5,6,7,8,9。但是在for迴圈外面在呼叫陣列中的函式時,是因為在for迴圈體外,出了for迴圈的作用域,作用域這裡我就不再解釋了,所以導致後面在呼叫的時候,i的已經變成了for迴圈結束之後的值了,也就是10,也因此列印出十個10.
3.修改後的**也就是第二段**為什麼列印的是0,1,2,3,4,5,6,7,8,9,是因為它在for迴圈體內,在作用域內,因此能訪問到正確的i值。
好,分析完了,那麼我們有什麼方法可以修改原題之後,達到我們想要的效果,也就是分別列印出0,1,2,3,4,5,6,7,8,9呢?
博主這裡提供兩種:
1)es5的方法:立即呼叫函式方法
// es5知識,我們可以利用「立即呼叫函式」解決這個問題
var funcs =
for (var i = 0; i < 10; i++)
})(i))}
funcs.foreach(function(func) )
2)es6的方法:
const funcs = ;
for (let i = 0; i < 10; i++) )
}funcs.foreach(func => func())
一道關於JS作用域的面試題
1 var x 1 2var obj 11 說出下面的輸出結果 obj.dbl 解析 this.x指向當前物件,所以this.x 2等同於obj.x 2 而x 2,在當前作用域中沒有找到宣告,則在全域性作用域下查詢是否有x,x 2等同於window.x 2 日誌列印輸出2 4,此時window.x為...
js作用域相關的一道題
今天有個夥伴問了我乙個題目,題目如下 var x 10 function fn function show f show fn 略作沉思,我的回答是20,小夥伴說是10 我昂,按照我的尿性我腦袋想的是四捨五入這段等於 var x 10 function show f show fn 但是其實不是這樣...
一 GCC的作用和執行機制
gcc是linux下重要的編譯工具,用法這裡就不說了,滿大街都找得到。這裡我重點介紹gcc的運作機制,作為 分析的鋪墊。全篇使用c語言子部件來作分析,因為我對其他語言的編譯沒有研究。根據編譯原理,語言的編譯分為這麼幾個步驟 詞法分析 語法分析 語義分析 中間語言生成 優化 目標 生成等。然而從編譯器...