var是否可以省略
一般情況下,是可以省略var的,但有兩點值得注意:
1、var a=1
與 a=1
,這兩條語句一般情況下作用是一樣的。但是前者不能用delete
刪除。不過,絕大多數情況下,這種差異是可以忽略的。
2、在函數內部,如果沒有用var
進行申明,則創建的變量是全局變量,而不是局部變量了。
所以,建議變量申明加上var關鍵字。
變量提升
JavaScript引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然后再一行一行地運行。這造成的結果,就是所有的變量的聲明語句,都會被提升到代碼的頭部,這就叫做變量提升(hoisting)。
示例:
console.log(a);
var a =1;
以上語句並不會報錯,只是提示undefined
。實際運行過程:
var a;
console.log(a);
a =1;
表示變量a已聲明,但還未賦值。但是變量提升只對var命令聲明的變量有效,如果一個變量不是用var命令聲明的,就不會發生變量提升。
console.log(aa);
aa =1;
以上代碼將會報錯:ReferenceError: aa is not defined
。
與普通變量一樣,js里的function
也可看做變量,也存在變量提升情況:
a();
function a(){
console.log(1);
};
表面上,上面代碼好像在聲明之前就調用了函數a
。但是實際上,由於“變量提升”,函數a
定義部分被提升到了代碼頭部,也就是在調用之前已經聲明了。但是,如果采用賦值語句定義函數,JavaScript就會報錯:
a();
var a = function(){
console.log(1);
};
// TypeError: a is not a function
因為,實際運行過程:
var a;
a();
a = function(){
console.log(1);
};
這時候a是個變量,並非function
。
參考:
http://javascript.ruanyifeng.com/grammar/basic.html#toc3