JavaScript作用域(第七天)
我們都知道js代碼是由自上而下的執行,但我們來看看下面的代碼;
test();
function test(){
console.log("hello world");
};
如果我們簡單的認為js是由自上而下的執行,那麽上面的代碼應該會報錯,提示test 不是一個方法;但結果並沒有報錯,而是進行正確的輸出了;
這樣我們就應該知道js執行分為兩部分
1.預解析;2.執行
預解析會將var 定義的變量及function進行提前處理;
也就是說上面的代碼會被處理為
function test(){
console.log("hello world");
}
test();
所以調用並沒有報錯;
下面我們再來測試var
alert(a);
var a=1;
這時候彈出的是undefined;註意,並沒有報錯;
而上面的代碼其實是被預解析為
var a;
alert(a);
a=1;
所以彈出的是一個undefined;
當變量與函數同名的時候,會忽略變量的提升,下面我們看一個例子
console.log(test);
function test(){
}
console.log(test);
var test=123;
console.log(test);
上面的代碼會被預處理為
function test(){
}
console.log(test);
console.log(test);
test=123;
console.log(test);
我們可以看出變量名提升被忽略了;
函數表達式不會被提升的,如
test();
var test=function(){
};
這時候運行,就會報錯;提示test不是一個方法;
預處理的代碼為
var test;
test();
test=function(){
};
js中沒有塊級作用域;
例如
if(true){
var a=123;
}
如果是其他語言,如java,c#變量a只在if塊級作用域有效;
但在js中並沒有這樣的塊級作用域;會被預處理為
var a;
if(true){
a=123;
}
JavaScript作用域(第七天)