javascript中兩種定義函數方式的差別以及函數的先行編譯效果,javascript編譯
我們知道在javascript中定義函數的方式有以下兩種:
function mm(){ }
這種形式是聲明一個函數,跟 var 聲明一個變數機制一樣,指令碼在解釋執行之前會做先行編譯處理。
var mm = function(){ }
這種形式是對一個變數賦值,雖然也做先行編譯,但僅僅只是給 mm 事先變數分配一個記憶體空間,而沒有做初始化。
代碼1:
alert(a);//列印函數a的記憶體 alert(b);//undefined alert(c);//JS報錯:“c”未定義 function a() { } var b = function(){};
代碼2:
func(); //2 func = function() {alert(1);}; func(); //1 function func() {alert(2);}; func(); //1
可見:
Javascript並非完全的按順序解釋執行,而是在解釋之前會對Javascript進行一次“先行編譯”。第一種方式定義的函數,javascript允許在函數定義之前被使用;第二種方式定義的函數,不能提前使用,因為其值是undefined。
javascript的函數定義的不同
第一段:new function使用系統內建函數對象來構建一個函數
var sum=new function(a,b) 相當於:
function 匿名類();
var sum=new 匿名類(a,b);
當你執行new的時候就已經從Function建立了一個執行個體,而a , b 不存在 ,
所以輸出 a+b 按照數學運算 空值相加得到 NaN
第二段:var sum=function(a,b) 相當於:function sum(a,b)
所以可以輸出:ab;
JavaScript:函式宣告與函數運算式
javascript雖然是解釋執行的語言,但也會進行先行編譯。
if(condition){ function sayHi(){ alert("Hi!"); }}else{ function sayHi(){ alert("Yo!"); }}
這種形式,JS引擎在先行編譯的過程中會註冊方法到window對象下,就是window.sayHi。
而不會顧及if else條件,導致重複的sayHi方法被註冊,在這種情況下是無效文法。
var sayHi;if(condition){ sayHi=function sayHi(){ alert("Hi!"); };}else{ sayHi=function sayHi(){ alert("Yo!"); };}
而下面這種是作為一個 變數(而非函數function),變數是可以被重複賦值的,所以文法不會有問題。
不知道有沒有說清楚。