javascript作用域概念的理解,局部變量提前聲明理解。
首先,我們先看一個javascript的題目;
if (!("a" in window)) {
var a = 1;
}
alert(a);
大家先想想結果是什麼...
要得到這個結果,那麼我就必須知道javascript的作用域知識和javascript的局部變量聲明提前的概念。
javascript作用域: 變量在聲明他們的函數體內部的任何位置(包過這個函數體內嵌套的任何函數體內)都是可讀取的。
局部變量聲明提前:javascript局部變量在整個作用域開始聲明(不會初始化), 在原出初始化。
我們程序員對概念一般都很難理解,那下面我們來解釋下上面的小試題從而理解作用域和局部變量聲明提前的概念。
首先,在if語句裏面的判斷in運算符。in運算符是用來判斷對象是否存在對應的屬性。例如:
eg: var ob = {}; "name" in ob ----- false
var ob = {"name": "xx"} "name" in ob ----- true
知道了in運算符之後我們再來看下作用域的問題:
我們知道java,c,c++,c#的作用域是塊級作用域(以一對花括號來隔離作用域),花括號內的每一段代碼都有各自的作用域,並且變量在聲明他們的代碼段之外是不可見的。
而javascript的作用域有些不一樣。javascript中沒有塊級作用域的概念,javascript的作用域是函數作用域。即在函數內任何地方聲明的變量,在這個函數內的任何地方都是可以訪問的。
我們來看看試題,在if語句塊內,我們聲明定義了變量a,那麼在本作用域(這裏的代碼是定義在全局對象中的,對客戶端javascript來時就是window對象下,那麼這裏的作用域和全局作用域一樣)中的任何地方都可以訪問到變量a。還有局部變量在作用域內聲明提前,那麼我們可以這麼理解代碼:
var a;
if (!("a" in window)) {
a = 1;
}
alert(a);
那麼在代碼的第一行聲明變量a時候,因爲這是全局作用域,也就相當於給window添加a屬性。
window.a = undefined;
if( !("a" in window)){
a = 1;
}
alert(a);
這麼來計算的話,那麼題目的結果就顯而易見是undefined。
這個小題目對javascript的作用域還沒有體現出來,但我們能夠從中理解javascript的聲明式提前。
下次會繼續講解javascript的作用域,this,等相關問題。有問題歡迎騷擾,一起探討。
if (!("a" in window)) {
var a = 1;
}
alert(a);
大家先想想結果是什麼...
要得到這個結果,那麼我就必須知道javascript的作用域知識和javascript的局部變量聲明提前的概念。
javascript作用域: 變量在聲明他們的函數體內部的任何位置(包過這個函數體內嵌套的任何函數體內)都是可讀取的。
局部變量聲明提前:javascript局部變量在整個作用域開始聲明(不會初始化), 在原出初始化。
我們程序員對概念一般都很難理解,那下面我們來解釋下上面的小試題從而理解作用域和局部變量聲明提前的概念。
首先,在if語句裏面的判斷in運算符。in運算符是用來判斷對象是否存在對應的屬性。例如:
eg: var ob = {}; "name" in ob ----- false
var ob = {"name": "xx"} "name" in ob ----- true
知道了in運算符之後我們再來看下作用域的問題:
我們知道java,c,c++,c#的作用域是塊級作用域(以一對花括號來隔離作用域),花括號內的每一段代碼都有各自的作用域,並且變量在聲明他們的代碼段之外是不可見的。
而javascript的作用域有些不一樣。javascript中沒有塊級作用域的概念,javascript的作用域是函數作用域。即在函數內任何地方聲明的變量,在這個函數內的任何地方都是可以訪問的。
我們來看看試題,在if語句塊內,我們聲明定義了變量a,那麼在本作用域(這裏的代碼是定義在全局對象中的,對客戶端javascript來時就是window對象下,那麼這裏的作用域和全局作用域一樣)中的任何地方都可以訪問到變量a。還有局部變量在作用域內聲明提前,那麼我們可以這麼理解代碼:
var a;
if (!("a" in window)) {
a = 1;
}
alert(a);
那麼在代碼的第一行聲明變量a時候,因爲這是全局作用域,也就相當於給window添加a屬性。
window.a = undefined;
if( !("a" in window)){
a = 1;
}
alert(a);
這麼來計算的話,那麼題目的結果就顯而易見是undefined。
這個小題目對javascript的作用域還沒有體現出來,但我們能夠從中理解javascript的聲明式提前。
下次會繼續講解javascript的作用域,this,等相關問題。有問題歡迎騷擾,一起探討。