函數作用域

今天看書,發現我有個觀念一直不清楚。

範例一
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 一流程式設計師養成精華 第三版 (郭家寶 著)

results matching ""

    No results matching ""