JS中作用域
?
var scope = 'global'; var f = function () { console.log(scope); // 輸出 undefined var scope = 'f'; } f();?
上面代碼可能和你預(yù)想的不一樣,沒有輸出 global, 而是undefined,這是為什么呢?
這是 JavaScript 的一個特性,按照作用域搜索順序,在 console.log 函數(shù)訪問 scope 變
量時, JavaScript 會先搜索函數(shù) f 的作用域,恰巧在 f 作用域里面搜索到 scope 變量,
所以上層作用域中定義的 scope 就被屏蔽了,但執(zhí)行到 console.log 語句時, scope 還
沒被定義,或者說初始化,所以得到的就是 undefined 值了
?
1 var f = function() { 2 var scope = 'f0'; 3 (function() { 4 var scope = 'f1'; 5 (function() { 6 console.log(scope); // 輸出 f1 7 })(); 8 })(); 9 }; 10 f();
?
上面是一個函數(shù)作用域嵌套的例子,我們在最內(nèi)層函數(shù)引用了 scope 變量,通過作用
域搜索,找到了其父作用域中定義的 scope 變量。
有一點需要注意:函數(shù)作用域的嵌套關(guān)系是定義時決定的,而不是調(diào)用時決定的,也就
是說, JavaScript 的作用域是靜態(tài)作用域,又叫詞法作用域,這是因為作用域的嵌套關(guān)系可
以在語法分析時確定,而不必等到運行時確定。下面的例子說明了這一切:
var scope = 'top'; var f1 = function() {console.log(scope); }; f1(); // 輸出 top var f2 = function() {var scope = 'f2';f1(); }; f2(); // 輸出 top
?
這個例子中,通過 f2 調(diào)用的 f1 在查找 scope 定義時,找到的是父作用域中定義
的 scope 變量,而不是 f2 中定義的 scope 變量。這說明了作用域的嵌套關(guān)系不是在調(diào)用
時確定的,而是在定義時確定的
轉(zhuǎn)載于:https://www.cnblogs.com/Hizy/p/6689683.html
總結(jié)
- 上一篇: 求一个四个字的心情个性签名!
- 下一篇: 黄山太平索道下山到哪里