這個例子顯示了變量和函數的命名及其範圍在JavaScript中的重要性。考慮下面的代碼...
a = a();
console.log('typeof global variable a :',(typeof a));
function a() {
console.log('A');
a = function() {
console.log('B');
};
console.log('typeof global function a() inner function a() :',(typeof a));
}
console.log('typeof global function a() :',(typeof a));
a();
//=> ! TypeError: a is not a function
//=> A
//=> typeof global function a() inner function a() : function
//=> typeof global variable a : undefined
//=> typeof global function a() : undefined
那麼這是怎麼回事?
的function a()
的內部變量a
返回它的類型:function
全局變量a
設置爲function a()
的返回值 - 但這樣它會自動成爲undefined
功能不返回任何東西全球function a()
的類型仍然由值a
'外部'自己(可以這麼說) - undefined
N注意console.log()
的呼叫到達的順序?
不僅內部a
沒有設置爲var
,而是自動將其置於全局範圍內,但是a = a()
意味着它不再是一個函數!
它是a = a()
這導致a is not a function
TypeError。
在另一方面,當看我刪除a =
但留下的一切,因爲它是...
a();
console.log('typeof global variable a :',(typeof a));
function a() {
console.log('A');
a = function() {
console.log('B');
};
console.log('typeof global function a() inner function a() :',(typeof a));
}
console.log('typeof global function a() :',(typeof a));
a();
//=> A
//=> typeof global function a() inner function a() : function
//=> typeof global function a() : function
//=> typeof global variable a : function
//=> B
如何看順序改變了會發生什麼?
現在我們不能將'全局變量a'(像以前一樣)當作變量來考慮 - a
只是一個指向函數的標記。
function a()
被調用時,將觸發console.log(
甲)
,復位令牌a
(它本身)的新功能,並且然後將觸發console.log(
乙)
時再次調用。
有更多的細節可以從中擠出來,以及達到相同結果的更好方法,但調用控制檯對於發生的事情是一個很大的線索。不要把這個例子看作是一個可用的模式 - 把它想象成一個暗示JavaScript引擎如何執行它的功能的東西。
您可能會發現這篇文章從JavaScriptIsSexy.com有用:JavaScript Variable Scope and Hoisting Explained
所以正確的做法應該是'恢復功能(){警報( 'B')}',而不是說。所以書中的錯誤? – xcode
是的,返回像'a = a()'那樣的函數。我會將其添加到我的答案中。 – nnnnnn
謝謝。非常清楚和有用的答案 – xcode