摘要:函數表達式對于函數聲明,函數的名稱是必須的,而對于函數表達式而言則是可選的,因此,就出現了匿名函數表達式和命名函數表達式。這是因為對命名函數處理的機制,函數的名稱永遠在函數內部的作用域中有效。
function 是 Javascript 中的第一類對象,這就意味著函數可以像其他值一樣被傳遞。一個最常見的用法就是將一個匿名函數作為回調函數傳遞到另外一個異步函數中。
函數聲明function foo() {}
函數 foo 將會在整個程序執行前被 hoist (提升),因此它在定義 foo 函數的整個 scope (作用域)中都是可用的。即使在函數定義之前調用它也沒問題。
foo(); // Works because foo was created before this code runs function foo() {}
函數表達式因為我打算專門寫篇介紹作用域的博文,所以這里就不詳述了。如果對 scope 和 hoist 有疑惑,可用閱讀 @nightire 凡哥的博文 - 《理解 JavaScript(二)》,里面詳細介紹了 scope 和 hoist 的含義和用法。
對于函數聲明,函數的名稱是必須的,而對于函數表達式而言則是可選的,因此,就出現了匿名函數表達式和命名函數表達式。如下:
函數聲明: function functionName (){ }
函數聲明: function functionName[可選](){ }
那么我就知道,如果沒有函數名的話,一定就是函數表達式,但是對于有函數名的情況該如何判斷呢?
Javascript 規定如果整個函數體是作為表達式的一部分時,那么它就是函數表達式,否則即是函數聲明。以下為表達式:
var fuc = foo(){}
我們再舉幾個極端的表達式例子:
!function foo(){} true && function foo(){}
以上的語句這里只是為了區分函數表達式,一般不會這樣寫。那么用一個對比的例子來看看效果:
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"); };匿名函數表達式
var foo = function() {};
上面的例子將一個匿名函數賦值給了變量 foo。
foo; // "undefined" foo(); // this raises a TypeError var foo = function() {};
由于 var 是一個聲明所以這里對變量 foo 進行 hoist (提升),因此當程序執行時,變量 foo 是可調用的。
但是由于賦值語句只有在運行時才生效,所以變量 foo 的值為 undefined。
另一個要講到的就是命名函數的賦值。
var foo = function bar() { bar(); // Works }; bar(); // ReferenceError
在這里,命名函數 bar 賦值給了變量 foo,所以在函數聲明外是不可見的,但在 bar 函數內部仍然可以調用。這是因為 Javascript 對命名函數處理的機制,函數的名稱永遠在函數內部的作用域中有效。
參考http://bonsaiden.github.io/JavaScript-Garden/#function.general
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87522.html
在之前的介紹中,我們已經知道 Javascript 沒有塊級作用,只有函數級作用域。 function test() { // a scope for(var i = 0; i < 10; i++) { // not a scope // count } console.log(i); // 10 } Javascript 中也沒有顯示的命名空間,這就...
Javascript 中的構造函數與其他語言相比也是不同的。任何通過關鍵字 new 調用的函數都可以當做構造函數。 在構造函數體內,this 指向新創建的對象。如果構造函數體內沒有顯示的 return 表達式,那么我們就默認返回 this,也就是新建的對象。 function Foo() { this.bla = 1; } Foo.prototype.test = function()...
因為最近有博友反饋我的博文是直接翻譯的參考鏈接內的內容,所以我在這里要說明一下,以免引起不必要的誤會。 首先,我很喜歡 segmentfault 的交流和學習的氛圍,所以我很愿意在這里跟各位 SFer 交流學習心得,相互學習,共同進步。 第二,我做技術方面的工作不久,所以學習經歷也不是很長,但是我發現寫博客,總結自己的學習心得是個很好的學習習慣,至少對于我個人而言,我于此收益頗豐,所以我決定堅持一...
摘要:與其他編程語言相比,對的使用是一套完全不同的機制。在五種情況下的值是各有不同的。調用一個函數時在這里,同樣指向全局對象。此時在函數內,指向新建的對象。盡管,晚綁定初看上去是個不好的決定,但實際上這是原型式繼承工作的基礎。 與其他編程語言相比,Javascript 對 this 的使用是一套完全不同的機制。this 在五種情況下的值是各有不同的。 全局作用域下 this; 當在全...
摘要:有兩個可以表示空的值,分別是和,比較有作用的是前者。訪問聲明但未初始化的變量。有返回值時函數的表達式沒有顯式的返回任何內容。然而,為了比較其他變量和值,我們需要提前取得的值。因此,從標準實行后,全局變量已經是不再可寫。 Javascript 有兩個可以表示空的值,分別是 undefined 和 null,比較有作用的是前者。 undefined undefined 是一種值為 un...
閱讀 2731·2023-04-25 22:15
閱讀 1810·2021-11-19 09:40
閱讀 2155·2021-09-30 09:48
閱讀 3225·2021-09-03 10:36
閱讀 2031·2021-08-30 09:48
閱讀 1858·2021-08-24 10:00
閱讀 2732·2019-08-30 15:54
閱讀 705·2019-08-30 15:54