看下面一段代碼:
(function () {var x = foo();var foo = function foo () {return "foobar";};return x;
})();
(不許打出來)猜猜返回結果是什么…
答案是
// foo is not a function
下面來解釋為什么會這樣,首先得明白:
1.如果變量聲明了但未賦值,則會顯示undefined
2.如果給一個聲明的變量賦值一個未定義的函數(bar)的執行結果.會顯示bar is not a function
3.在函數中,函數及變量的聲明(var)都會被提升到頂部
明白了這些之后,回到最初的栗子:
外層是一個立即執行函數(function(){ … })()
中間部分:
var x = foo();
var foo = function foo() {return "foobar"
};
// 以上代碼實際等價于下面;
var x, foo;
x = foo();
foo = function foo(){return "foobar"
};
當執行到 x = foo()時, 由于foo不是一個函數.故會拋出錯誤(foo is not a function).函數停止執行.