1. 程式人生 > >js函式作用域例題

js函式作用域例題

下面程式碼輸出是什麼?

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