首先,提到作用域,要了解一個常識:
javascript中沒有塊級作用域,只有函數作用域和全局作用域。
什麼是塊級作用域?塊級作用域就是定義在{}之內的範圍,比如if(){}或者for(){}裏那個{}裏的範圍就叫做塊級作用域。
如:if(){}
if(0 < 2)
{
var name = "jeri";
}
alert(name);//jeri,
for(){}
for(var i=0;i<9;i++)
{
}
alert(i);//9
我們在編寫代碼的時候,不要在“塊”裏面聲明變量,要在“塊”開始的地方就聲明好,以免出現錯誤,如:
var i;
for(i=0;i<9;i++)
{
}
alert(i);//9
所以,在聲明變量時,我們要做到,全局變量要在代碼前端聲明,函數中的變量要在函數體一開始的地方就聲明好。除了這兩個地方,其他地方都不要出現變量聲明。
下面來說作用域,簡單的說,作用域相當於一個區域,就是爲了說明這個區域有多大,而不包括這個區域裏有什麼東西。這個區域裏有什麼東西恰恰就是這個作用域所對應的執行上下文所要說明的東西。如:
作用域有上下級的關係,上下級關係的確定就看函數是在哪個作用域下創建的。例如,fn作用域下創建了bar函數,那麼“fn作用域”就是“bar作用域”的上級。(也可以說父子關係)
我們知道,作用域最大的用處就是隔離變量,不同作用域下同名變量不會有衝突。
另外,我們還需牢記於心的是,作用域是在函數創建的時候就已經確定了,而不是函數調用的時候。
函數創建和函數調用可是兩個不同的概念,函數創建就是定義一個函數,函數調用是在某處調用一個已經定義好的函數。下面舉一個例子來說明:
function foo() //函數創建,定義了foo函數,而foo函數的作用域也在此時確定了
{
alert("buddy!");
}
alert("hey!");
foo();//調用函數,這裏調用foo函數
作用域的概念很好理解,到這就結束了,下一篇將會講作用域鏈與自由變量。
下一篇: javascript執行上下文、作用域與閉包(第三篇)—自由變量與作用域鏈
本文參考了王福朋老師的深入理解javascript原型和閉包(13)