函數作用域
今天看書,發現我有個觀念一直不清楚。
範例一
var a = 'test';
var f = function () {
console.log(a); // output 'test'
}
f();
範例二
var a = 'test';
var f = function () {
console.log(a); // output undefined
var a = 'ccc';
}
f();
由此可知 JS 的變數搜尋是 由內而外,先以作用域搜尋
範例二為例,console 在 f function 作用域裡面有找到 var a = 'ccc' 的定義,所以忽視上層作用域 var a = 'test' 的定義,但執行到 consoel.log(a) 的時候,a 還沒有被定義,所以此時會得到 undefined 的值。
範例A
var f = function () {
var a = 'test1';
var f2 = function() {
var a = 'test2'
var f3 = function () {
console.log(a); // output 'test2'
}
f3();
}
f2();
}
f()
範例B
var a = 'test';
var f1 = function () {
console.log(a); //output 'test'
}
f1();
var f2 = function () {
var a = 'test2';
f1();
}
f2(); //output 'test2'
由範例B可證,JS 的嵌套關是定義時決定的,而非呼叫時決定。
參考資料:
- [書本] Google 御用網頁語言 Node.js 一流程式設計師養成精華 第三版 (郭家寶 著)