Javascript 變量、函數的聲明

javascript變量

全局變量和局部變量
    按照變量的做用域來區分,和大多數編程語言相似,javascript變量也分爲全局變量和局部變量。全局變量的做用域是整個js文件,而局部變量的做用域是該變量被定義的函數內部,也包括在該函數內部定義的函數的內部。其實不管是全局變量仍是局部變量,他們都是在其被建立的環境(好比函數)中,以及被建立的環境所包含的子環境(好比函數內部的函數)中有效。javascript

塊做用域
    變量的做用域是基於函數的,而不是基於塊的。在c++中,在花括號 { }中聲明的變量,在花括號外不可見,這就是塊做用域;而在javascript中,花括號內部聲明的局部變量,在花括號外仍可見。java

function f1(){
   if(1){
      var a = 100;
   }
   alert(a);
}
f1(); // alert 100

 

變量和函數的聲明

    在javascript引擎解析javascript代碼的時候,首先javascript引擎會把變量和函數的聲明提早進行預解析,而後再去執行其餘代碼。c++

變量的聲明
    變量的聲明只有一種方式,就是用var關鍵字聲明,直接賦值不是一種聲明方式!它僅僅是在全局對象上建立了新的屬性(而不是變量)。
    var num = 1; 是在當前域中聲明變量,若是在方法中聲明,則爲局部變量;若是是在全局域中聲明,則爲全局變量。
    而num=1; 是對屬性賦值的操做,首先,它會嘗試在當前做用域鏈中解析num,若是在當前做用域鏈中找到num,則會執行對num屬性賦值;若是沒有找到num,它會在上一層做用域鏈中找.... 直到找到最上層的做用域,即全局做用域,此時它會在全局做用域中創造num屬性並賦值。
    因爲變量聲明自帶不可刪除屬性,好比var num=1 和 num = 1,前者是變量聲明,帶不可刪除屬性,所以沒法被刪除;後者爲全局變量的一個屬性,能夠從全局變量中刪除。
聲明和賦值的區別
(1)聲明會在解釋器預解析js代碼的時候被提早,而賦值不會。編程

alert(a); // undefined ,被聲明提早,但此刻未被賦值
alert(b); // error "b" is not defined
b = 10;
var a = 20;

 

(2)直接賦值形式是在執行階段建立編程語言

alert(a); // undefined
b = 10;
alert(b); // 10, 代碼執行階段建立

var a = 20;
alert(a); // 20, 代碼執行階段修改

 

(3)變量不能被刪除,屬性能夠函數

a = 10;
alert(window.a); // 10,是一個全局對象window的屬性
alert(delete a); // true
alert(window.a); // undefined
var b = 20;
alert(window.b); // 20
alert(delete b); // false
alert(window.b); // 仍然爲 20,由於變量是不可以刪除的。

 

函數聲明
    函數聲明有三種方式:
(1)function name(){} 直接建立spa

function add(a,b){
    return a+b;
}
add(5,4);

 

(2)new Function 構建函數建立code

var add=new Function("a", "b", "return a+b;");
add(4,5);

 

(3)給變量賦值匿名函數方法建立對象

var add = function(a,b){
    return a+b;
}
add(4,5);
 

其中,第二種和第三種方法,在聲明前訪問時,返回的都是一個undefined的變量。在聲明後訪問他們都是一個function的函數。
若是變量名和函數名聲明相同,函數優先聲明blog

alert(x); // function
var x = 10;
alert(x); // 10
x = 20;
function x() {};
alert(x); // 20
相關文章
相關標籤/搜索