成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

細(xì)說 Javascript 函數(shù)篇(一) : 函數(shù)聲明和函數(shù)表達(dá)式

hizengzeng / 3370人閱讀

摘要:函數(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)部的作用域中有效。

functionJavascript 中的第一類對(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() {}
  

因?yàn)槲掖蛩銓iT寫篇介紹作用域的博文,所以這里就不詳述了。如果對(duì) scopehoist 有疑惑,可用閱讀 @nightire 凡哥的博文 - 《理解 JavaScript(二)》,里面詳細(xì)介紹了 scopehoist 的含義和用法。

函數(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 TypeError
var 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)部的作用域中有效。

參考

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

相關(guān)文章

  • 細(xì)說 Javascript 函數(shù)(六) : ?作用域與命名空間

    在之前的介紹中,我們已經(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 中也沒有顯示的命名空間,這就...

    VishKozus 評(píng)論0 收藏0
  • 細(xì)說 Javascript 函數(shù)(五) : ?構(gòu)造函數(shù)

    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()...

    sPeng 評(píng)論0 收藏0
  • 細(xì)說 Javascript 函數(shù)(四) : ?arguments 對(duì)象

    因?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)持一...

    aristark 評(píng)論0 收藏0
  • 細(xì)說 Javascript 函數(shù)(二) : this 的工作機(jī)制

    摘要:與其他編程語言相比,對(duì)的使用是一套完全不同的機(jī)制。在五種情況下的值是各有不同的。調(diào)用一個(gè)函數(shù)時(shí)在這里,同樣指向全局對(duì)象。此時(shí)在函數(shù)內(nèi),指向新建的對(duì)象。盡管,晚綁定初看上去是個(gè)不好的決定,但實(shí)際上這是原型式繼承工作的基礎(chǔ)。 與其他編程語言相比,Javascript 對(duì) this 的使用是一套完全不同的機(jī)制。this 在五種情況下的值是各有不同的。 全局作用域下 this; 當(dāng)在全...

    ZoomQuiet 評(píng)論0 收藏0
  • 細(xì)說 Javascript 拾遺(二) : undefined null

    摘要:有兩個(gè)可以表示空的值,分別是和,比較有作用的是前者。訪問聲明但未初始化的變量。有返回值時(shí)函數(shù)的表達(dá)式?jīng)]有顯式的返回任何內(nèi)容。然而,為了比較其他變量和值,我們需要提前取得的值。因此,從標(biāo)準(zhǔn)實(shí)行后,全局變量已經(jīng)是不再可寫。 Javascript 有兩個(gè)可以表示空的值,分別是 undefined 和 null,比較有作用的是前者。 undefined undefined 是一種值為 un...

    My_Oh_My 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<