關於var與function的解析順序問題

2021-06-25 20:14:45 字數 2643 閱讀 8555

先給幾段**,看看你能知道執行結果不

function example1() ;

return f;

var f = function() ;

}var a1 = example1();

alert(a1());

function example2() ;

return f;

function f() ;

}var a2 = example2();

alert(a2());

function example3() ;

return f;

var f = function() ;

}var a3 = example3();

alert(a3());

function example4() ;

return f;

function f() ;

}var a4 = example4();

alert(a4());

function example5() ;

function f() ;

return f;

}var a5 = example5();

alert(a5());

function example6() ;

var f = function() ;

return f;

}var a6 = example6();

alert(a6());

function example7() ;

var f = function() ;

var f;

return f;

}var a7 = example7();

alert(a7());

先給出執行結果1,2,1,1,1,2,2

解釋一下,這裡必須搞清楚js在解析執行時會把宣告放在前邊,比如var a=1;那解析時會把var放在當前作用域最前面進行解析,而a=1只是個賦值操作,解析執行時位置不變,舉個簡單的例子,比如有如下**:

alert(f);

執行時肯定會報錯,因為f未定義,如果我們改寫成如下**

var f = function(){};

alert(f);

那一定會列印function(){},這個地球人都知道,如果把**寫成下面樣子

alert(f);

var f = function(){};

那麼可能有人就不太注意了,這時候執行是不會報錯的,列印的是undefined,因為執行時會把宣告提前,所以上面的**在解析執行時,實際上變成了以下**:

var f;

alert(f);

f = function(){};

然後再說一下function,function是一種宣告加賦值的寫法,還是繼續上面的例子,先給出一段**

alert(f);

function f(){}

這時候會列印出function f(){},我們可以看到使用function進行函式定義時,不僅宣告提前了,就連賦值也提前了,上面的**在解析執行時,實際變成這樣

var f;

f = function f(){};

alert(f);

接下來我們討論var 與 function一起出現的時候優先順序問題,function的優先順序要大於var,也就是function的宣告會在var前面,並且function的賦值會在等號賦值的前面,我們就分析一下文章開關的example5的**

function example5() ;

function f() ;

return f;

}var a5 = example5();

alert(a5());

我們看到var和function都宣告了乙個變數f,而且這個f進行了兩次賦值,一次是直接用等號賦值,另一次是function賦值,依據前面的優先順序規則,function的宣告和賦值都會優先,所以這段**在解析執行時變成了下面的**:

function example5() ; // function賦值

f = function() ; // 等號賦值

return f;

}var a5 = example5();

alert(a5());

所以最後的執行結果為1。

好了,至此你應該明白文章開頭的7個示例**的執行結果了吧。

最後再給出乙個小例子,看你有沒有理解

function example() ;

}var a = example();

alert(f);

執行會報錯

function example() ;

}var a = example();

alert(f);

執行結果為1

這裡就不做解釋了,請讀者自己思考一下

函式宣告之function與var

紙上得來終覺淺,絕知此事要躬行。軟體這行業,很多東西還是要靠敲 敲出來的,你以為看書看的很通透,例子也能做出來的東西,一需要深入混合運用頓時覺得懵逼了。關鍵還是在於一知半解,不夠深入。今天我就總結一下近段時間遇到並糾結過的一些知識。老規矩,由淺入深,用發散性思維思考每個知識點。一 宣告乙個函式 fu...

關於Function類與Object之間的關係

js中的所有類,本身具有三種身份 1.函式 可以直接被呼叫 2.物件 應該有其所屬類鏈 3.類,擁有prototype原型 原型所指例項中必然存在constructor函式,同時,這個constructor指標本身就是指向這個函式本身!關於 proto 1.proto 稱為原型鏈 2.js中的所有物...

關於var的用法

1 var 是在全域性範圍內有效,可以多次宣告 2 var與const let的區別 let 跟 var 的作用差不多,但有著非常重要的區別。最明顯的區別是,let 宣告的範圍是塊作用域,而 var 宣告的範圍是函式作用域。const let是es6及其以上版本的關鍵字 es6命名規範 常量 con...