1. 程式人生 > >JavaScript作用域(第七天)

JavaScript作用域(第七天)

AR 結果 asc 註意 作用域 例如 沒有 簡單 var

我們都知道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作用域(第七天)