js函式作用域例題
阿新 • • 發佈:2018-12-21
下面程式碼輸出是什麼?
function fun(n, o){
console.log(o);
return {
fun : function(m){
return fun(m, n);
}
}
}
var a = fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1);
c.fun(2);
c.fun(3);
這是一道關於函式作用域的問題。
首先,我們因該知道,返回物件的fun屬性呼叫的是最外層的fun函式,而不是它自己,否則就是遞迴造成的死迴圈
在一個函式執行時,如果遇到它自身沒有的變數,那麼它會去作用域中尋找,如果還是沒有,那麼就會報錯,
瞭解了上面的知識,這道題我們最起碼時因該有思路的,var a = fun(0), 這句的輸出肯定是undefined,這沒問題,
a.fun(1), 接下來呼叫fun(1, 0),這個0來自於它的作用域,這個函式它本身是沒有的,所以輸出0;
接下來,a.fun(2), => fun (2, n),這個n是多少呢?知道了這個這道題就沒問題了,n因該還是0,為什麼呢?
因為a沒有得到更新,還是原先的那個在fun(0)時生成的a,它的fun函式的順著作用域往下找,找到的n是0,
可能你會說:哎呀,不對啊,a.fun(1)執行的時候,不是呼叫了fun(1, 0),使得n變成1了嗎?是的沒錯,是使得n變成了1,
但這是對於,fun(1,0)返回的那個物件來說的,對於由fun(0),生成的這個a,它的fun屬性所能找的n始終為0,
因為每一次函式執行,都會生成一個新的object,返回的物件也是新的,這個新的物件裡的屬性fun,
對應的作用域也是新的,(範圍沒變,但所能找到的n的值變了)
明白了我上面所說的,你就能知道答案是什麼了
undefined 0 0 0
undefined 0 1 2
undefined 0 1 1