JavaScript中的函數聲明和函數表達式

JavaScript 中定義函數的方式有兩種,一種是函數聲明,另一種是函數表達式。這兩種定義方式之間有一些細微的差別。

1.函數聲明:

    function 關鍵字 + 函數名字 + 函數體構成了函數聲明,具體形式如下:

function functionName(arg0, arg1, arg2) {
  // function body
}

Firefox Safari Chrome Opera 都給函數定義了一個非標準的 name 屬性,通過這個屬性可以訪問到給函數指定的名字:

alert(functionName.name);//"functionName"

關於函數聲明的一個重要特徵就是函數聲明提升(function declaration hoisting,意爲在執行代碼前會先讀取函數聲明,也就是說可以在函數聲明前調用函數:

sayHello();//"Hello"
function sayHello() {
  alert("Hello~");
}

 

2.函數表達式:

函數表達式有點類似常規的變量賦值語句,這種情況下創建的函數叫做匿名函數(anonymous function),具體形式如下:

var functionName = function(arg0, arg1, arg2) {
  // function body
};

函數表達式與函數聲明主要有兩點不同,一是由於函數表達式定義的爲匿名函數,因此該變量的 name 屬性是空字符串:

alert(functionName.name);//""

二是函數表達式沒有函數聲明提升這一特性,因此不能再函數表達式前調用函數:

sayHello();//error
var sayHello = function() {
  alert("ello~");
};

 

看一個例子,幫助我們更好地理解一下函數聲明函數表達式:

代碼片段一:

if (condition) {
  function sayHello() {
    alert("Hello version_1");
  }
} else {
  function sayHello() {
    alert("Hello version_2");
  }
}

表面上看,以上代碼表示在 condition true 時,使用一個 sayHello() 的定義,否則就使用另一個定義。但是這種方式很危險,可能會有意想不到的結果,但是,如果使用函數表達式,就沒有什麼問題了,如下代碼片段:

代碼片段二:

var sayHello;
if (condition) {
  sayHello = function() {
    alert("Hello version_1");
  };
} else {
  sayHello = function() {
    alert("Hello version_2");
  };
}


本文出自 “細桶假狗屎” 博客,請務必保留此出處http://xitongjiagoushi.blog.51cto.com/9975742/1637798

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章