在JavaScript學(xué)習(xí)中不少的小伙伴們都會(huì)在函數(shù)這方面有某些問(wèn)題,對(duì)于JavaScript函數(shù)這方面小編為大家整理了有關(guān)于在JavaScript函數(shù)定義的方法分享,希望對(duì)大家的學(xué)習(xí)有所幫助!
方法一:函數(shù)定義語(yǔ)句
我們現(xiàn)在來(lái)看下代碼:
//求和函數(shù)
function sum(a,b){
return a+b;
}
上面的這個(gè)代碼時(shí)我們比較典型的函數(shù)聲明,通過(guò)以function之后其后在跟隨函數(shù)的名稱(chēng)標(biāo)識(shí)符、小括號(hào)和中大括號(hào)。對(duì)于這種函數(shù)定義方式我們是需要顯示指定的函數(shù)名稱(chēng),我們?cè)诖a執(zhí)行中可以通過(guò)函數(shù)名稱(chēng)來(lái)調(diào)用我們的函數(shù),我們可以看看下面的例子:
console.log(sum); //控制臺(tái)輸出sum函數(shù)的源代碼,此時(shí)函數(shù)還未定義
function sum(a,b){
return a+b;
}
console.log(sum(2,3)); //5
既然上面介紹了有關(guān)于函數(shù)聲明之后,那對(duì)于函數(shù)的作用域就不得不說(shuō)一下了,函數(shù)作用域是指在函數(shù)中聲明的所有變量的函數(shù)體始終可見(jiàn),這就說(shuō)明了我們的變量在聲明之前已經(jīng)可以使用,通過(guò)這個(gè)特點(diǎn)我們可以稱(chēng)它為聲明提前,下面我們來(lái)看一串代碼:
var scope = "global";
function f(){
console.log(scope); //輸出“undefined”,而不是“global”
var scope = "local"; //變量在這里賦初始值,但變量本身在函數(shù)體內(nèi)任何地方均是有定義的
console.log(scope); //輸出“l(fā)ocal”
}
f();
以上代碼等價(jià)于
var scope = "global";
function f() {
var scope; //在函數(shù)頂部聲明了局部變量,即聲明提前
console.log(scope); //變量存在,輸出“undefined”,而不是“global”
var scope = "local"; //變量在這里賦初始值
console.log(scope); //輸出“l(fā)ocal”
}
f();
在代碼中我們?cè)诤瘮?shù)體內(nèi)聲明所有變量,而且在聲明之前就已經(jīng)有了定義,但是呢只有在執(zhí)行這個(gè)變量時(shí)候才會(huì)被賦值。
方法二:函數(shù)直接量表達(dá)式
我們先來(lái)看看下面代碼:
//求階乘的函數(shù)
var factorial = function fact(x){ //將函數(shù)賦值給一個(gè)變量
if(x<0) {return NaN;}
else if(x===0) {return 1;}
else
return x*fact(x-1); //遞歸函數(shù)
};
console.log(factorial(3)); //6
在代碼中我們可以看出,它與函數(shù)定義語(yǔ)句是一樣的,通過(guò)使用我們的 function。然而一般這種方式的定義是使用于將它作為一個(gè)大的表達(dá)式的一部分的,就像是在賦值、調(diào)用和定義函數(shù)類(lèi)似。那么這種方式的話是比較適合對(duì)于哪些在開(kāi)發(fā)中只會(huì)被使用到一次的函數(shù)。如下所示:
var f=function(x){ //省略函數(shù)名的匿名函數(shù)
return x*x;
}
與函數(shù)定義語(yǔ)句不同的是,函數(shù)直接量表達(dá)式是在執(zhí)行到代碼時(shí)才加載函數(shù)的,我們可以用下面的代碼來(lái)說(shuō)明。
console.log(f); //控制臺(tái)輸出undefined,此時(shí)函數(shù)f還未加載
var f=function(x){ //開(kāi)始加載函數(shù)
return x*x;
}
console.log(f); //控制臺(tái)輸出函數(shù)的源代碼
方法三:Function()構(gòu)造函數(shù)
先看代碼:
var f = new Function("x","y","return x+y"); //Function()構(gòu)造函數(shù)
var f = function(x,y){return x+y}; //這兩條代碼是等價(jià)的
通過(guò)這個(gè)方法我們可以傳入任意數(shù)量的字符串實(shí)參,而且最后一個(gè)實(shí)參所表示的文本是函數(shù)體,這個(gè)方法它是可以包含任意數(shù)量的JavaScript語(yǔ)句的,而且在使用的時(shí)候如果構(gòu)造的函數(shù)不包含任何參數(shù)的話,我們只需要輸入一個(gè)函數(shù)就可以了。這個(gè)方法和其他兩個(gè)方法是不一樣的,這個(gè)方法是允許JavaScript在運(yùn)行的時(shí)候動(dòng)態(tài)地創(chuàng)建翻譯函數(shù),而且我們每次在調(diào)用這個(gè)方法的時(shí)候函數(shù)都會(huì)進(jìn)行解析函數(shù)體。所以在多次使用或者循環(huán)使用的話,效率是會(huì)受到影響的。相比之下循環(huán)中的嵌套函數(shù)和函數(shù)定義表達(dá)式就不會(huì)每次執(zhí)行的時(shí)候進(jìn)行重新編譯。
對(duì)于這個(gè)構(gòu)造函數(shù)還有一點(diǎn)是值得我們注意的,那就是它所創(chuàng)建的函數(shù)并不是使用詞法作用域,都因?yàn)楹瘮?shù)體代碼在編譯的時(shí)候總在頂層函數(shù)執(zhí)行,代碼如下所示:
var a = 3; //在頂層函數(shù)中聲明變量a
function f(){
var a = 2; //在函數(shù)體內(nèi)聲明局部變量a
return new Function("return a*a;"); //無(wú)法捕獲局部作用域
}
console.log(f()()); //控制臺(tái)輸出9而非4,說(shuō)明構(gòu)造函數(shù)的編譯在頂層函數(shù)執(zhí)行
那么對(duì)于這個(gè)問(wèn)題我們可以在全局作用域中進(jìn)行執(zhí)行eval()。
總結(jié):
以上就是有關(guān)于“JavaScript怎么定義函數(shù)?”這個(gè)問(wèn)題的相關(guān)內(nèi)容,希望對(duì)大家的學(xué)習(xí)和了解有所幫助,當(dāng)然如果你有更好的方法也可以和大家一同分享,跟多有關(guān)于JavaScript這方面的內(nèi)容我們都可以在W3Cschool中進(jìn)行學(xué)習(xí)和了解。