函數(shù)聲明
function foo() {}函數(shù) foo 將會(huì)在整個(gè)程序執(zhí)行前被 hoist (提升),因此它在定義 foo 函數(shù)的整個(gè) scope (作用域)中都是可用的。即使在函數(shù)定義之前調(diào)用它也沒問題。
foo(); // Works because foo was created before this code runsfunction foo() {}因?yàn)槲掖蛩銓iT寫篇介紹作用域的文章,所以這里就不詳述了。
函數(shù)表達(dá)式
對(duì)于函數(shù)聲明,函數(shù)的名稱是必須的,而對(duì)于函數(shù)表達(dá)式而言則是可選的,因此,就出現(xiàn)了匿名函數(shù)表達(dá)式和命名函數(shù)表達(dá)式。如下:
函數(shù)聲明: function functionName (){ }
函數(shù)聲明: function functionName[可選](){ }
那么我就知道,如果沒有函數(shù)名的話,一定就是函數(shù)表達(dá)式,但是對(duì)于有函數(shù)名的情況該如何判斷呢?
Javascript 規(guī)定如果整個(gè)函數(shù)體是作為表達(dá)式的一部分時(shí),那么它就是函數(shù)表達(dá)式,否則即是函數(shù)聲明。以下為表達(dá)式:
var fuc = foo(){}我們?cè)倥e幾個(gè)極端的表達(dá)式例子:
!function foo(){}true && function foo(){}以上的語句這里只是為了區(qū)分函數(shù)表達(dá)式,一般不會(huì)這樣寫。那么用一個(gè)對(duì)比的例子來看看效果:
foo1();//foo1 is not defined foo2();//works because foo2 was created before this code runs!function foo1() { alert('foo1 works');};function foo2() { alert('foo2 works');};匿名函數(shù)表達(dá)式
var foo = function() {};上面的例子將一個(gè)匿名函數(shù)賦值給了變量 foo。
foo; // 'undefined'foo(); // this raises a TypeErrorvar foo = function() {};由于 var 是一個(gè)聲明所以這里對(duì)變量 foo 進(jìn)行 hoist (提升),因此當(dāng)程序執(zhí)行時(shí),變量 foo 是可調(diào)用的。
但是由于賦值語句只有在運(yùn)行時(shí)才生效,所以變量 foo 的值為 undefined。
命名函數(shù)表達(dá)式
另一個(gè)要講到的就是命名函數(shù)的賦值。
var foo = function bar() { bar(); // Works};bar(); // ReferenceError在這里,命名函數(shù) bar 賦值給了變量 foo,所以在函數(shù)聲明外是不可見的,但在 bar 函數(shù)內(nèi)部仍然可以調(diào)用。這是因?yàn)?Javascript 對(duì)命名函數(shù)處理的機(jī)制,函數(shù)的名稱永遠(yuǎn)在函數(shù)內(nèi)部的作用域中有效。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注