全局變量和局部變量
按照變量的做用域來區分,和大多數編程語言相似,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