JS特殊函數(shù)(Function()構(gòu)造函數(shù)、函數(shù)直接量)區(qū)別介紹
更新時(shí)間:2013年05月19日 15:40:08 作者:
函數(shù)是由這樣的方式進(jìn)行聲明的:關(guān)鍵字 function、函數(shù)名、一組參數(shù),以及置于括號(hào)中的待執(zhí)行代碼;Function()構(gòu)造函數(shù)實(shí)際上是功能完整的對(duì)象
函數(shù)定義
函數(shù)是由這樣的方式進(jìn)行聲明的:關(guān)鍵字 function、函數(shù)名、一組參數(shù),以及置于括號(hào)中的待執(zhí)行代碼。
函數(shù)的構(gòu)造語(yǔ)法有這三種:
Js代碼
1.function functionName(arg0, arg1, ... argN) { statements }//function語(yǔ)句
2.var function_name = new Function(arg1, arg2, ..., argN, function_body);//Function()構(gòu)造函數(shù)
3.var func = function(arg0, arg1, ... argN) { statements };//函數(shù)直接量
示例:
Js代碼
1.function f(x){return x*x};//function語(yǔ)句
2.var f = new Function("x","return x*x;");//Function()構(gòu)造函數(shù)
3.var f = function(x){return x*x;};//函數(shù)直接量
如果函數(shù)無(wú)明確的返回值,或調(diào)用了沒(méi)有參數(shù)的 return 語(yǔ)句,那么它真正返回的值是 undefined。
Function()構(gòu)造函數(shù)
函數(shù)實(shí)際上是功能完整的對(duì)象 。Function類可以表示開(kāi)發(fā)者定義的任何函數(shù)。用Function類直接創(chuàng)建函數(shù)的語(yǔ)法如下:
var function_name = new function(arg1, arg2, ..., argN, function_body)
在上面的形式中,每個(gè) arg 都是一個(gè)參數(shù),最后一個(gè)參數(shù)是函數(shù)主體(要執(zhí)行的代碼)。這些參數(shù)必須是字符串。
var sayHi = new Function("sName", "sMessage", "alert('Hello ' + sName + sMessage);");
sayHi("jzj,", "你好!");//Hello jzj,你好!
函數(shù)名只是指向函數(shù)的變量,那么可以把函數(shù)作為參數(shù)傳遞給另一個(gè)函數(shù)嗎?答案是可以的,請(qǐng)看:
Js代碼
function callAnotherFunc(fnFunction, vArgument) {
fnFunction(vArgument);
}
var doAdd = new Function("iNum", "alert(iNum + 10)");
callAnotherFunc(doAdd, 10); //輸出 "20"
注意:盡管可以使用 Function 構(gòu)造函數(shù)創(chuàng)建函數(shù),但最好不要使用它,因?yàn)橛盟x函數(shù)比用傳統(tǒng)方式要慢得多。不過(guò),所有函數(shù)都應(yīng)看作 Function 類的實(shí)例 。
如果你定義的函數(shù)沒(méi)有參數(shù),那么可以只需給構(gòu)造函數(shù)傳遞一個(gè)字符串(即函數(shù)的主體)即可。
注意:傳遞給構(gòu)造函數(shù)Function()的參數(shù)中沒(méi)有一個(gè)用于說(shuō)明它要?jiǎng)?chuàng)建的函數(shù)名。用Function()構(gòu)造函數(shù)創(chuàng)建的未命名函數(shù)有時(shí)被稱為“匿名函數(shù)”。
Function()函數(shù)允許我們動(dòng)態(tài)地建立和編譯一個(gè)函數(shù),它不會(huì)將我們限制在function語(yǔ)句預(yù)編譯的函數(shù)體中。
函數(shù)直接量
函數(shù)直接量是一個(gè)表達(dá)式,它可以定義匿名函數(shù)。函數(shù)直接量的語(yǔ)法和function語(yǔ)句非常相似,只不過(guò)它被用作表達(dá)式,而不是用作語(yǔ)句,而且也無(wú)需指定函數(shù)名。語(yǔ)法:
Js代碼
var func = function(arg0, arg1, ... argN) { statements };//函數(shù)直接量
雖然函數(shù)直接量創(chuàng)建的是未命名函數(shù),但是它的語(yǔ)法也規(guī)定它可以指定函數(shù)名,這在編寫(xiě)調(diào)用自身的遞歸函數(shù)時(shí)非常有用,例如:
Js代碼
var f = function fact(x) {
if (x <= 1) {
return 1;
} else {
return x * fact(x - 1);
}
};
注:它并沒(méi)有真正創(chuàng)建一個(gè)名為fact()函數(shù),只是允許函數(shù)體用這個(gè)名字來(lái)引用自身。JavaScript1.5之前的版本中沒(méi)有正確實(shí)現(xiàn)這種命名的函數(shù)直接量。
•函數(shù)引用
函數(shù)名并沒(méi)有什么實(shí)質(zhì)意義,它不過(guò)是用來(lái)保存函數(shù)的變量名字,可以將這個(gè)函數(shù)賦給其他變量,它仍然會(huì)以相同方式起作用:
Js代碼
function square(x){return x*x;}
var a = square;
var b = a(5);//b 為25
這有點(diǎn)像C++中的函數(shù)指針了。
Function()構(gòu)造函數(shù)和函數(shù)直接量差別
Function()構(gòu)造函數(shù)和函數(shù)直接量之間的差別有一點(diǎn)就是:使用構(gòu)造函數(shù)Function()創(chuàng)建的函數(shù)不使用詞法作用域,相反的,它們總是被頂級(jí)函數(shù)來(lái)編譯,如:
Js代碼
var y = "global";
function constructFunction() {
var y = "local";
//Function()構(gòu)造函數(shù)
return new Function("return y;");//不使用局部作用域
}
function constFunction() {
var y = "local";
//函數(shù)直接量
var f = function () {
return y;//使用局部作用域
};
return f;
}
//顯示 global,因?yàn)镕unction()構(gòu)造函數(shù)返回的函數(shù)并不使用局部作用域
alert(constructFunction()());
//顯示 lobal,因?yàn)楹瘮?shù)直接量返回的函數(shù)并使用局部作用域
alert(constFunction()());
函數(shù)是由這樣的方式進(jìn)行聲明的:關(guān)鍵字 function、函數(shù)名、一組參數(shù),以及置于括號(hào)中的待執(zhí)行代碼。
函數(shù)的構(gòu)造語(yǔ)法有這三種:
Js代碼
復(fù)制代碼 代碼如下:
1.function functionName(arg0, arg1, ... argN) { statements }//function語(yǔ)句
2.var function_name = new Function(arg1, arg2, ..., argN, function_body);//Function()構(gòu)造函數(shù)
3.var func = function(arg0, arg1, ... argN) { statements };//函數(shù)直接量
示例:
Js代碼
復(fù)制代碼 代碼如下:
1.function f(x){return x*x};//function語(yǔ)句
2.var f = new Function("x","return x*x;");//Function()構(gòu)造函數(shù)
3.var f = function(x){return x*x;};//函數(shù)直接量
如果函數(shù)無(wú)明確的返回值,或調(diào)用了沒(méi)有參數(shù)的 return 語(yǔ)句,那么它真正返回的值是 undefined。
Function()構(gòu)造函數(shù)
函數(shù)實(shí)際上是功能完整的對(duì)象 。Function類可以表示開(kāi)發(fā)者定義的任何函數(shù)。用Function類直接創(chuàng)建函數(shù)的語(yǔ)法如下:
var function_name = new function(arg1, arg2, ..., argN, function_body)
在上面的形式中,每個(gè) arg 都是一個(gè)參數(shù),最后一個(gè)參數(shù)是函數(shù)主體(要執(zhí)行的代碼)。這些參數(shù)必須是字符串。
var sayHi = new Function("sName", "sMessage", "alert('Hello ' + sName + sMessage);");
sayHi("jzj,", "你好!");//Hello jzj,你好!
函數(shù)名只是指向函數(shù)的變量,那么可以把函數(shù)作為參數(shù)傳遞給另一個(gè)函數(shù)嗎?答案是可以的,請(qǐng)看:
Js代碼
復(fù)制代碼 代碼如下:
function callAnotherFunc(fnFunction, vArgument) {
fnFunction(vArgument);
}
var doAdd = new Function("iNum", "alert(iNum + 10)");
callAnotherFunc(doAdd, 10); //輸出 "20"
注意:盡管可以使用 Function 構(gòu)造函數(shù)創(chuàng)建函數(shù),但最好不要使用它,因?yàn)橛盟x函數(shù)比用傳統(tǒng)方式要慢得多。不過(guò),所有函數(shù)都應(yīng)看作 Function 類的實(shí)例 。
如果你定義的函數(shù)沒(méi)有參數(shù),那么可以只需給構(gòu)造函數(shù)傳遞一個(gè)字符串(即函數(shù)的主體)即可。
注意:傳遞給構(gòu)造函數(shù)Function()的參數(shù)中沒(méi)有一個(gè)用于說(shuō)明它要?jiǎng)?chuàng)建的函數(shù)名。用Function()構(gòu)造函數(shù)創(chuàng)建的未命名函數(shù)有時(shí)被稱為“匿名函數(shù)”。
Function()函數(shù)允許我們動(dòng)態(tài)地建立和編譯一個(gè)函數(shù),它不會(huì)將我們限制在function語(yǔ)句預(yù)編譯的函數(shù)體中。
函數(shù)直接量
函數(shù)直接量是一個(gè)表達(dá)式,它可以定義匿名函數(shù)。函數(shù)直接量的語(yǔ)法和function語(yǔ)句非常相似,只不過(guò)它被用作表達(dá)式,而不是用作語(yǔ)句,而且也無(wú)需指定函數(shù)名。語(yǔ)法:
Js代碼
復(fù)制代碼 代碼如下:
var func = function(arg0, arg1, ... argN) { statements };//函數(shù)直接量
雖然函數(shù)直接量創(chuàng)建的是未命名函數(shù),但是它的語(yǔ)法也規(guī)定它可以指定函數(shù)名,這在編寫(xiě)調(diào)用自身的遞歸函數(shù)時(shí)非常有用,例如:
Js代碼
復(fù)制代碼 代碼如下:
var f = function fact(x) {
if (x <= 1) {
return 1;
} else {
return x * fact(x - 1);
}
};
注:它并沒(méi)有真正創(chuàng)建一個(gè)名為fact()函數(shù),只是允許函數(shù)體用這個(gè)名字來(lái)引用自身。JavaScript1.5之前的版本中沒(méi)有正確實(shí)現(xiàn)這種命名的函數(shù)直接量。
•函數(shù)引用
函數(shù)名并沒(méi)有什么實(shí)質(zhì)意義,它不過(guò)是用來(lái)保存函數(shù)的變量名字,可以將這個(gè)函數(shù)賦給其他變量,它仍然會(huì)以相同方式起作用:
Js代碼
復(fù)制代碼 代碼如下:
function square(x){return x*x;}
var a = square;
var b = a(5);//b 為25
這有點(diǎn)像C++中的函數(shù)指針了。
Function()構(gòu)造函數(shù)和函數(shù)直接量差別
Function()構(gòu)造函數(shù)和函數(shù)直接量之間的差別有一點(diǎn)就是:使用構(gòu)造函數(shù)Function()創(chuàng)建的函數(shù)不使用詞法作用域,相反的,它們總是被頂級(jí)函數(shù)來(lái)編譯,如:
Js代碼
復(fù)制代碼 代碼如下:
var y = "global";
function constructFunction() {
var y = "local";
//Function()構(gòu)造函數(shù)
return new Function("return y;");//不使用局部作用域
}
function constFunction() {
var y = "local";
//函數(shù)直接量
var f = function () {
return y;//使用局部作用域
};
return f;
}
//顯示 global,因?yàn)镕unction()構(gòu)造函數(shù)返回的函數(shù)并不使用局部作用域
alert(constructFunction()());
//顯示 lobal,因?yàn)楹瘮?shù)直接量返回的函數(shù)并使用局部作用域
alert(constFunction()());
相關(guān)文章
總結(jié)JavaScript在IE9之前版本中內(nèi)存泄露問(wèn)題
本篇文章給大家總結(jié)了JavaScript在IE9之前版本中內(nèi)存泄露問(wèn)題,對(duì)此有興趣的朋友可以學(xué)習(xí)下。2018-04-04
javascript cookie用法基礎(chǔ)教程(概念,設(shè)置,讀取及刪除)
這篇文章主要介紹了javascript cookie用法,結(jié)合實(shí)例形式總結(jié)分析了javascript中cookie的定義、特點(diǎn)及獲取、設(shè)置、刪除等基本操作技巧,需要的朋友可以參考下2016-09-09
JavaScript入門教程(6) Window窗口對(duì)象
他是JavaScript中最大的對(duì)象,它描述的是一個(gè)瀏覽器窗口。一般要引用它的屬性和方法時(shí),不需要用“window.xxx”這種形式,而直接使用“xxx”。一個(gè)框架頁(yè)面也是一個(gè)窗口。2009-01-01
打開(kāi)windows運(yùn)行對(duì)話框的js
打開(kāi)windows運(yùn)行對(duì)話框的js...2007-02-02
actionscript與javascript的區(qū)別
actionscript是flash的腳本語(yǔ)言,目前已經(jīng)由adobe公司升級(jí)到3.0版本,成為了真正意義的oop語(yǔ)言,JavaScript是由netscape工程師設(shè)計(jì)完成的一門腳本語(yǔ)言,用于web開(kāi)發(fā)的前端腳本2011-05-05
javaScript復(fù)制功能調(diào)用實(shí)現(xiàn)方案
說(shuō)到使用js實(shí)現(xiàn)點(diǎn)擊復(fù)制的功能,我下面想說(shuō)的方法也是和網(wǎng)上的大同小異的。js實(shí)現(xiàn)是很簡(jiǎn)單,最難的是兼容問(wèn)題,畢竟用IE以外的人還是有很多的2012-12-12
做web開(kāi)發(fā) 先學(xué)JavaScript
當(dāng)你正在尋找 web 開(kāi)發(fā)的工作時(shí),我認(rèn)為 JavaScript 是可以起步的偉大語(yǔ)言,他進(jìn)入門檻低、跨平臺(tái)、已經(jīng)成熟而且是個(gè)很好的跳板。2014-12-12

