js中變量做用域

首先看一個例子:函數

function Foo() {this

    getName = function () { alert (1); };spa

    return this;code

}
Foo中的getName理解爲變量,它沒有var聲明, 因此先向當前Foo函數做用域內尋找getName變量,沒有。
再向當前函數做用域上層,即外層做用域內尋找是否含有getName變量。
是一個從裏到外尋找變量的過程, 會一直向上查找到window對象,若window對象中也沒有getName屬性,就在window對象中var一個getName變量(全局變量)。
 
 
先貼上幾個例子的代碼截圖,方便從基礎理解之
 
 
 
 
JavaScript的函數定義有個特色,它會先掃描整個函數體的語句,把全部申明的變量「提高」到函數頂部。
1 'use strict'; 2 
3 function foo() { 4     var x = 'Hello, ' + y; 5  alert(x); 6     var y = 'Bob'; 7 } 8 
9 foo();

對於上述foo()函數,JavaScript引擎看到的代碼至關於:對象

function foo() { var y; // 提高變量y的申明
    var x = 'Hello, ' + y; alert(x); y = 'Bob'; }

var y = 'Bob';拆分爲了 var y ;y='Bob';因此y的值爲undefined
因此爲了不各類怪異事件的發生,最好在函數開頭聲明須要的變量;
function foo() { var x = 1, // x初始化爲1
        y = x + 1, // y初始化爲2
        z, i; // z和i爲undefined
    // 其餘語句:
    for (i=0; i<100; i++) { ... } }
 
JavaScript默認有一個全局對象window
直接訪問全局變量a和訪問window.a是徹底同樣的
 
'use strict'; function foo() { for (var i=0; i<100; i++) { //  } i += 100; // 仍然能夠引用變量i
}

爲了解決塊級做用域,ES6引入了新的關鍵字let,用let替代var能夠申明一個塊級做用域的變量
'use strict'; function foo() { for (var i=0; i<100; i++) { //  } i += 100; // 仍然能夠引用變量i
}
相關文章
相關標籤/搜索