您好,登錄后才能下訂單哦!
這篇文章主要講解了“JavaScript定義函數的方法有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JavaScript定義函數的方法有哪些”吧!
方法一:函數定義語句
我們現在來看下代碼:
//求和函數
function sum(a,b){
return a+b;
}
上面的這個代碼時我們比較典型的函數聲明,通過以function之后其后在跟隨函數的名稱標識符、小括號和中大括號。對于這種函數定義方式我們是需要顯示指定的函數名稱,我們在代碼執行中可以通過函數名稱來調用我們的函數,我們可以看看下面的例子:
console.log(sum); //控制臺輸出sum函數的源代碼,此時函數還未定義
function sum(a,b){
return a+b;
}
console.log(sum(2,3)); //5
既然上面介紹了有關于函數聲明之后,那對于函數的作用域就不得不說一下了,函數作用域是指在函數中聲明的所有變量的函數體始終可見,這就說明了我們的變量在聲明之前已經可以使用,通過這個特點我們可以稱它為聲明提前,下面我們來看一串代碼:
var scope = "global";
function f(){
console.log(scope); //輸出“undefined”,而不是“global”
var scope = "local"; //變量在這里賦初始值,但變量本身在函數體內任何地方均是有定義的
console.log(scope); //輸出“local”
}
f();
以上代碼等價于
var scope = "global";
function f() {
var scope; //在函數頂部聲明了局部變量,即聲明提前
console.log(scope); //變量存在,輸出“undefined”,而不是“global”
var scope = "local"; //變量在這里賦初始值
console.log(scope); //輸出“local”
}
f();
在代碼中我們在函數體內聲明所有變量,而且在聲明之前就已經有了定義,但是呢只有在執行這個變量時候才會被賦值。
方法二:函數直接量表達式
我們先來看看下面代碼:
//求階乘的函數
var factorial = function fact(x){ //將函數賦值給一個變量
if(x<0) {return NaN;}
else if(x===0) {return 1;}
else
return x*fact(x-1); //遞歸函數
};
console.log(factorial(3)); //6
在代碼中我們可以看出,它與函數定義語句是一樣的,通過使用我們的 function。然而一般這種方式的定義是使用于將它作為一個大的表達式的一部分的,就像是在賦值、調用和定義函數類似。那么這種方式的話是比較適合對于哪些在開發中只會被使用到一次的函數。如下所示:
var f=function(x){ //省略函數名的匿名函數
return x*x;
}
與函數定義語句不同的是,函數直接量表達式是在執行到代碼時才加載函數的,我們可以用下面的代碼來說明。
console.log(f); //控制臺輸出undefined,此時函數f還未加載
var f=function(x){ //開始加載函數
return x*x;
}
console.log(f); //控制臺輸出函數的源代碼
方法三:Function()構造函數
先看代碼:
var f = new Function("x","y","return x+y"); //Function()構造函數
var f = function(x,y){return x+y}; //這兩條代碼是等價的
通過這個方法我們可以傳入任意數量的字符串實參,而且最后一個實參所表示的文本是函數體,這個方法它是可以包含任意數量的JavaScript語句的,而且在使用的時候如果構造的函數不包含任何參數的話,我們只需要輸入一個函數就可以了。這個方法和其他兩個方法是不一樣的,這個方法是允許JavaScript在運行的時候動態地創建翻譯函數,而且我們每次在調用這個方法的時候函數都會進行解析函數體。所以在多次使用或者循環使用的話,效率是會受到影響的。相比之下循環中的嵌套函數和函數定義表達式就不會每次執行的時候進行重新編譯。
對于這個構造函數還有一點是值得我們注意的,那就是它所創建的函數并不是使用詞法作用域,都因為函數體代碼在編譯的時候總在頂層函數執行,代碼如下所示:
var a = 3; //在頂層函數中聲明變量a
function f(){
var a = 2; //在函數體內聲明局部變量a
return new Function("return a*a;"); //無法捕獲局部作用域
}
console.log(f()()); //控制臺輸出9而非4,說明構造函數的編譯在頂層函數執行
那么對于這個問題我們可以在全局作用域中進行執行eval()。
感謝各位的閱讀,以上就是“JavaScript定義函數的方法有哪些”的內容了,經過本文的學習后,相信大家對JavaScript定義函數的方法有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。