javascript中兩種定義函數方式的差別以及函數的先行編譯效果,javascript編譯

來源:互聯網
上載者:User

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),變數是可以被重複賦值的,所以文法不會有問題。

不知道有沒有說清楚。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.