先給幾段**,看看你能知道執行結果不
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...