App下載

JavaScript怎么定義函數(shù)?函數(shù)定義的方法分享!

猿友 2021-07-02 16:19:11 瀏覽數(shù) (2863)
反饋

在JavaScript學習中不少的小伙伴們都會在函數(shù)這方面有某些問題,對于JavaScript函數(shù)這方面小編為大家整理了有關(guān)于在JavaScript函數(shù)定義的方法分享,希望對大家的學習有所幫助!


方法一:函數(shù)定義語句

我們現(xiàn)在來看下代碼:

//求和函數(shù)
function sum(a,b){
return a+b;
}

上面的這個代碼時我們比較典型的函數(shù)聲明,通過以function之后其后在跟隨函數(shù)的名稱標識符、小括號和中大括號。對于這種函數(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ù)直接量表達式

我們先來看看下面代碼:

//求階乘的函數(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。然而一般這種方式的定義是使用于將它作為一個大的表達式的一部分的,就像是在賦值、調(diào)用和定義函數(shù)類似。那么這種方式的話是比較適合對于哪些在開發(fā)中只會被使用到一次的函數(shù)。如下所示:

var f=function(x){ //省略函數(shù)名的匿名函數(shù)
return x*x;
}


與函數(shù)定義語句不同的是,函數(shù)直接量表達式是在執(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ù)都會進行解析函數(shù)體。所以在多次使用或者循環(huán)使用的話,效率是會受到影響的。相比之下循環(huán)中的嵌套函數(shù)和函數(shù)定義表達式就不會每次執(zhí)行的時候進行重新編譯。

對于這個構(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í)行

那么對于這個問題我們可以在全局作用域中進行執(zhí)行eval()。


總結(jié):

以上就是有關(guān)于“JavaScript怎么定義函數(shù)?”這個問題的相關(guān)內(nèi)容,希望對大家的學習和了解有所幫助,當然如果你有更好的方法也可以和大家一同分享,跟多有關(guān)于JavaScript這方面的內(nèi)容我們都可以在W3Cschool中進行學習和了解。


0 人點贊