摘要:當函數(shù)是聲明語句的一部分是,他就是函數(shù)表達式。當執(zhí)行流到達函數(shù)表達式被創(chuàng)建,結果是,函數(shù)表達式只有他們被執(zhí)行后才能使用。這樣的函數(shù)叫匿名函數(shù)。總體來說,推薦使用函數(shù)聲明,除非有原因需要使用函數(shù)表達式。
函數(shù)聲明與表達式
函數(shù)和變量一樣,可以在代碼的任何地方定義。
JavaScript提供一些方式去定義方法:
函數(shù)聲明
函數(shù)表達式
函數(shù)作為另一個函數(shù)結果被調用
語法基本創(chuàng)建函數(shù)的語法是函數(shù)聲明。語法如下:
function f(arg1, arg2, ...) { ... code ... }
比如:
function sayHi(name) { alert("Hi, "+name) } sayHi("John")
這個例子聲明一個只有一個參數(shù)的函數(shù)sayHi,運行sayHi。
返回值用return聲明來返回值
function sum(a, b) { return a+b } var result = sum(2,5) alert(result)
如果函數(shù)沒有返回值,結果被認為是一個特殊值“undefined”。如下例:
function getNothing() { // no return } var result = getNothing() alert(result)
返回空值也是一樣結果:
function getNothing() { return } alert( getNothing() === undefined ) // true局部變量
函數(shù)內可以包含變量,用var來定義。這種變量叫做局部變量,只能被內部函數(shù)訪問。
function sum(a, b) { var sum = a + b return sum }
創(chuàng)建一個函數(shù)min(a,b),接收兩個數(shù)字,返回一個較小的值。
min(2, 5) == 2
min(3, -1) == -1
答案
方案一 用if判斷:
function min(a, b) { if (a < b) { return a } else { return b } }
方案二 用三目運算符:
function min(a, b) { return a < b ? a : b // 如果是true運行a,否則運行b }
寫一個函數(shù)pow(x,n)返回x的n次方,或者說,x被自己乘了n次。
pow(3, 2) = 3*3 = 9
pow(3, 3) = 333 = 27
pow(1, 100) = 11...*1 = 1
function(x,n){ var result for(var i = 0;i函數(shù)聲明 函數(shù)聲明在預執(zhí)行階段(當瀏覽器準備執(zhí)行代碼)解析。所以函數(shù)聲明在前后都能被調用到。
function sayHi(name) { alert("Hi, "+name) } sayHi("John")sayHi("John") function sayHi(name) { alert("Hi, "+name) }所以函數(shù)在任何位置都可以聲明
比如,我們可能希望根據(jù)條件聲明不同的函數(shù)
sayHi() if (1) { function sayHi() { alert(1) } } else { function sayHi() { alert(2) } // <-- }嘗試在不同瀏覽器中運行這個例子。火狐會報錯,其他瀏覽器輸出2。
那是因為聲明在執(zhí)行前被傳遞了。根據(jù)文檔(p.10.5),后同名的函數(shù),后
聲明的會覆蓋存在的函數(shù)。當執(zhí)行時,其他聲明會被忽略,所以if語句沒有任何效果。
函數(shù)表達式
JavaScript中函數(shù)是一等公民,和數(shù)字字符一樣。
在任何你可以寫值的地方,你都可以寫函數(shù)。函數(shù)表達式的語法function(arguments) { ... }舉例,你可以寫
var f = 5但你也可以賦函數(shù)表達式
var f = function(name) { alert("Hi, " + name + "!"); }什么時候函數(shù)是表達式,什么時候是聲明呢?
規(guī)則很簡單。
但javascript解析器在主代碼流中,他會認為這是函數(shù)聲明。
當函數(shù)是聲明語句的一部分是,他就是函數(shù)表達式。當執(zhí)行流到達函數(shù)表達式被創(chuàng)建,結果是,函數(shù)表達式只有他們被執(zhí)行后才能使用。
var sayHi // sayHi() <-- 這里不能執(zhí)行,還沒有sayHi函數(shù) if (1) { sayHi = function() { alert(1) } } else { sayHi = function() { alert(2) } } sayHi()上述代碼所有瀏覽器執(zhí)行結果相同。
請用聲明
經(jīng)驗不足的開發(fā)人員寫的代碼中,方法經(jīng)常用表達式來聲明:var f = function() { ... }函數(shù)聲明更加可讀簡潔,還是用函數(shù)聲明吧。
function f() { ... }除此以外,函數(shù)聲明可在定義前調用。
只有你在執(zhí)意要用函數(shù)表達式時采用。如例子中,條件性的函數(shù)定義。函數(shù)是值
javascript中的函數(shù)是一般值,我們可以輸出他。function f() { alert(1) } alert(f)上面這個輸出函數(shù)的例子。通常用作源代碼。( Usually as the source code.)
Both declarations and expression declare a variable and put the function into it. Only the creation time is different.
聲明和表達式都可以作為變量的值。只是創(chuàng)建的時間不同。傳遞函數(shù)
函數(shù)和任何值一樣可以被賦值,做為其他函數(shù)的參數(shù)傳遞等。
如下例,怎么定義函數(shù)沒有關系。
function sayHi(name) { alert("Hi, "+name) } var hi = sayHi // 把函數(shù)賦值給變量 hi("dude") // 執(zhí)行函數(shù)函數(shù)通過引用被賦值。函數(shù)保存在內存的某處,sayHi是它的引用(指向)。當我把函數(shù)賦值給hi,變量開始引用同一個函數(shù)。
一個函數(shù)可以接受另一個函數(shù)做為參數(shù)
function runWithOne(f) { // 運行做為參數(shù)1的函數(shù) f(1) } runWithOne( function(a){ alert(a) } )邏輯上說,函數(shù)是一個動作.那么,傳遞函數(shù)是傳遞一個動作,能夠在程序另一部分來初始化。這種特性在javascript中被廣泛使用。
在上面的例子中,我們創(chuàng)建一個沒有名字的函數(shù),沒有賦值給任何變量。這樣的函數(shù)叫匿名函數(shù)。
就地執(zhí)行
可以用函數(shù)表達式創(chuàng)建并立即運行函數(shù),像這樣:
(function() { var a, b // 局部變量 // ... // 其他代碼 })()立即執(zhí)行函數(shù)大多被用在我們想做一些圍繞局部變量的事情。我們不想我們的局部變量變成全局,所以包含在函數(shù)里面。
在執(zhí)行后,全局命名空間還是很干凈,很好的實踐。
那為什么函數(shù)在括號中?是因為javascript只允許函數(shù)表達式立即執(zhí)行。
函數(shù)聲明不能被這樣用:
function work() { // ... }() // 語法錯誤即使我們去掉名稱,javaScript會看到關鍵詞函數(shù),嘗試轉換成函數(shù)聲明。
function() { // 錯誤,沒有名稱的函數(shù)聲明。 // ... }()那么。唯一的方式是把函數(shù)用括號包起來。就會打斷他被認為是聲明的一部分,所以是函數(shù)表達式。
如果函數(shù)是一個明顯的表達式,那就沒必要包起來,如下:
var result = function(a,b) { return a+b }(2,2) alert(result) // 4在上面的代碼中,函數(shù)被創(chuàng)建且立即調用。
就像var result = sum(2,2),用sum函數(shù)替換函數(shù)表達式。下面的代碼執(zhí)行結果是什么?為什么?
var a = 5 (function() { alert(a) })()答案:
答案是error,嘗試下面代碼:var a = 5 (function() { alert(a) })()在var a = 5后面沒有分號。JavaScript把代碼認為是:
var a = 5(function() { alert(a) })()那么,他會嘗試運行5做為一個函數(shù),這就會造成錯誤。能運行的代碼如下:
var a = 5; (function() { alert(a) })()這可能JavaScript中是最危險隱蔽的不寫分號。
還有一種方式直接調用函數(shù)構造器。把參數(shù)列表和函數(shù)作為字符串,用他們創(chuàng)建函數(shù)。var sayHi = new Function("name", " alert("Hi, "+name) "); sayHi("Benedict");這種方式用的很少很少,幾乎不用。
命名函數(shù)表達式
一個函數(shù)表達式可有名字:var f = function sayHi(name) { alert("Hi, "+name) }語法叫命名函數(shù)表達式(NFE)在任何瀏覽器都可用除了IE9以下。
在那些支持的瀏覽器中,名字只在函數(shù)內可見
var f = function sayHi(name) { alert(sayHi) // 輸出函數(shù) } alert(sayHi) // 錯誤:為定義的變量"sayHi"在這種情況IE會創(chuàng)建兩個函數(shù)對象:sayHi和f:
var f = function g() { } // IE中是false,其他瀏覽器報錯(g為定義) alert(f=== g)NEFS存在是為了遞歸匿名函數(shù)。
觀察下面代碼片段被包在serTimeout中調用:setTimeout(function factorial(n) { return n == 1 ? n : n*factorial(n-1) }, 100)代碼的結果是什么?為什么?
( function g() { return 1 } ) alert(g)答案:
結果是error:( function g() { return 1 } ) alert(g)解決方案的關鍵是理解(function ... )是一個函數(shù)表達式(參考本章),不是函數(shù)聲明。
那么,我們有一個有名函數(shù)表達式。
有名函數(shù)表達式的名字只在內部可見。
除了IE9.0以下,所有瀏覽器都支持NFEs,那么他們會給出錯誤“undefined variable”,因為g只有在函數(shù)內部可見。
ie9.0以下不支持NFE,就會輸出函數(shù)
函數(shù)命名
函數(shù)是一個動作。所以命名應該是動詞,像get,read,caculateSum,等等。
短函數(shù)名稱的規(guī)則:一個函數(shù)是臨時的且只使用在附近的代碼。變量的短命名可用這個邏輯。
一個函數(shù)用在代碼任何地方。一方米昂,沒有忘記他的危險,另一方面,你可以寫的更少。
真實的例子‘$’, ‘$$’, ‘$A’, ‘$F’ 等。
JavaScript庫中頻繁調用的函數(shù)用這些短名稱。
其他情況,函數(shù)的名字應該是一個動詞,或者一個動詞開頭的多個詞疊加。總結
JavaScript中函數(shù)是普通值。他們可以按需求被賦值,傳遞,調用。
一個不返回值的函數(shù)事實上會返回一個特殊值:undefined。
使用動詞命名函數(shù)。短命名允許被用在兩種情況:被用在附近代碼塊,或被非常廣泛使用。
總體來說,推薦使用函數(shù)聲明,除非有原因需要使用函數(shù)表達式。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78813.html
摘要:示例代碼執(zhí)行上下文創(chuàng)建階段在這個階段上下文對象會生成,并創(chuàng)建變量對象創(chuàng)建作用域鏈確定的指向。全局對象是作用域鏈的頭,還意味著在頂層代碼中聲明的所有變量都將成為全局對象的屬性。 變量對象 這一節(jié)聊一下變量對象。都是干貨(^▽^) 變量對象是函數(shù)運行時數(shù)據(jù)的集合,存儲了在上下文中定義的變量和函數(shù),不同的函數(shù)的變量對象稍有不同。 還是從上下文說起,javascript 引擎執(zhí)行到函數(shù)的時候會...
摘要:是微軟開發(fā)的的超集,兼容,可以載入代碼然后運行。可處理已有的代碼,并只對其中的代碼進行編譯小編我決定使用白鷺引擎開發(fā)游戲,在開發(fā)游戲之前學習一下,目前它的可視化工具已經(jīng)可以打多端包了是一套完整的游戲開發(fā)解決方案。中包含多個工具以及項目。 TypeScript 是微軟開發(fā)的 JavaScript 的超集,TypeScript兼容JavaScript,可以載入JavaScript代碼然后運...
摘要:注意申明的權重函數(shù)的形參申明聲明聲明也就之前提高的變量提升第部分執(zhí)行先執(zhí)行,再執(zhí)行兩個,再執(zhí)行函數(shù)表達式申明,及執(zhí)行。 一段代碼看出JS的的解析到執(zhí)行的順序規(guī)則 代碼 function bar(a, b) { b = 3; var b; function b(){} console.log(a); // 打印出:10 console.log(b)...
閱讀 2771·2021-10-11 11:08
閱讀 1489·2021-09-30 09:48
閱讀 1049·2021-09-22 15:29
閱讀 1037·2019-08-30 15:54
閱讀 976·2019-08-29 15:19
閱讀 527·2019-08-29 13:12
閱讀 3161·2019-08-26 13:53
閱讀 958·2019-08-26 13:28