摘要:函數(shù)表達(dá)式對(duì)于函數(shù)聲明,函數(shù)的名稱是必須的,而對(duì)于函數(shù)表達(dá)式而言則是可選的,因此,就出現(xiàn)了匿名函數(shù)表達(dá)式和命名函數(shù)表達(dá)式。這是因?yàn)閷?duì)命名函數(shù)處理的機(jī)制,函數(shù)的名稱永遠(yuǎn)在函數(shù)內(nèi)部的作用域中有效。
function 是 Javascript 中的第一類對(duì)象,這就意味著函數(shù)可以像其他值一樣被傳遞。一個(gè)最常見的用法就是將一個(gè)匿名函數(shù)作為回調(diào)函數(shù)傳遞到另外一個(gè)異步函數(shù)中。
函數(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 runs function foo() {}
函數(shù)表達(dá)式因?yàn)槲掖蛩銓iT寫篇介紹作用域的博文,所以這里就不詳述了。如果對(duì) scope 和 hoist 有疑惑,可用閱讀 @nightire 凡哥的博文 - 《理解 JavaScript(二)》,里面詳細(xì)介紹了 scope 和 hoist 的含義和用法。
對(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 TypeError var foo = function() {};
由于 var 是一個(gè)聲明所以這里對(duì)變量 foo 進(jìn)行 hoist (提升),因此當(dāng)程序執(zhí)行時(shí),變量 foo 是可調(diào)用的。
但是由于賦值語句只有在運(yùn)行時(shí)才生效,所以變量 foo 的值為 undefined。
另一個(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)部的作用域中有效。
參考http://bonsaiden.github.io/JavaScript-Garden/#function.general
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87522.html
在之前的介紹中,我們已經(jīng)知道 Javascript 沒有塊級(jí)作用,只有函數(shù)級(jí)作用域。 function test() { // a scope for(var i = 0; i < 10; i++) { // not a scope // count } console.log(i); // 10 } Javascript 中也沒有顯示的命名空間,這就...
Javascript 中的構(gòu)造函數(shù)與其他語言相比也是不同的。任何通過關(guān)鍵字 new 調(diào)用的函數(shù)都可以當(dāng)做構(gòu)造函數(shù)。 在構(gòu)造函數(shù)體內(nèi),this 指向新創(chuàng)建的對(duì)象。如果構(gòu)造函數(shù)體內(nèi)沒有顯示的 return 表達(dá)式,那么我們就默認(rèn)返回 this,也就是新建的對(duì)象。 function Foo() { this.bla = 1; } Foo.prototype.test = function()...
因?yàn)樽罱胁┯逊答佄业牟┪氖侵苯臃g的參考鏈接內(nèi)的內(nèi)容,所以我在這里要說明一下,以免引起不必要的誤會(huì)。 首先,我很喜歡 segmentfault 的交流和學(xué)習(xí)的氛圍,所以我很愿意在這里跟各位 SFer 交流學(xué)習(xí)心得,相互學(xué)習(xí),共同進(jìn)步。 第二,我做技術(shù)方面的工作不久,所以學(xué)習(xí)經(jīng)歷也不是很長,但是我發(fā)現(xiàn)寫博客,總結(jié)自己的學(xué)習(xí)心得是個(gè)很好的學(xué)習(xí)習(xí)慣,至少對(duì)于我個(gè)人而言,我于此收益頗豐,所以我決定堅(jiān)持一...
摘要:與其他編程語言相比,對(duì)的使用是一套完全不同的機(jī)制。在五種情況下的值是各有不同的。調(diào)用一個(gè)函數(shù)時(shí)在這里,同樣指向全局對(duì)象。此時(shí)在函數(shù)內(nèi),指向新建的對(duì)象。盡管,晚綁定初看上去是個(gè)不好的決定,但實(shí)際上這是原型式繼承工作的基礎(chǔ)。 與其他編程語言相比,Javascript 對(duì) this 的使用是一套完全不同的機(jī)制。this 在五種情況下的值是各有不同的。 全局作用域下 this; 當(dāng)在全...
摘要:有兩個(gè)可以表示空的值,分別是和,比較有作用的是前者。訪問聲明但未初始化的變量。有返回值時(shí)函數(shù)的表達(dá)式?jīng)]有顯式的返回任何內(nèi)容。然而,為了比較其他變量和值,我們需要提前取得的值。因此,從標(biāo)準(zhǔn)實(shí)行后,全局變量已經(jīng)是不再可寫。 Javascript 有兩個(gè)可以表示空的值,分別是 undefined 和 null,比較有作用的是前者。 undefined undefined 是一種值為 un...
閱讀 2755·2023-04-25 22:15
閱讀 1818·2021-11-19 09:40
閱讀 2164·2021-09-30 09:48
閱讀 3238·2021-09-03 10:36
閱讀 2040·2021-08-30 09:48
閱讀 1876·2021-08-24 10:00
閱讀 2742·2019-08-30 15:54
閱讀 716·2019-08-30 15:54