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