Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
果您已經開始學習JavaScript了,那是時候了解下基本函數了,本章節為大家分享JavaScript基本函數!
一般來說,函數是經過精心挑選和設計以執行特定任務的子程序。
它是一個對象。要執行一個函數,您將調用它,也稱為調用函數。您還可以將值傳遞給函數以在函數中使用。事實上,函數總是會返回一個值。因此,如果您不指定返回值, JavaScript 函數將返回 undefined。
您可以通過多種方式在代碼中定義 JavaScript函數。首先,您將使用函數聲明。您可以使用關鍵字“function”創建函數聲明,然后添加函數的名稱。當您使用函數聲明時,您將提升函數定義,這將允許您在定義函數之前使用它。
接下來,您有一個任務 JavaScript 函數表達式。這定義了一個匿名或命名的名字 JavaScript 函數。匿名函數是尚未命名的函數。因為函數表達式不能被提升,所以在定義它們之前不能使用它們。
創建函數表達式的較短語法是箭頭函數。這種類型的 JavaScript 函數不會創建自己的值。它僅用于編寫不同的功能。
您可能聽說過“arguments”和“parameters”這兩個術語可以互換使用,這可能會導致您認為它們是同一個東西。雖然這兩個術語在涉及 JavaScript 函數時非常相似,但您應該了解一些非常重要的區別。
參數用于定義JavaScript 函數。這意味著參數是在定義 JavaScript 函數是最初創建的名稱。在進行函數定義時,您可能會傳遞多達 255 個 JavaScript 參數。使用逗號將參數與下一個參數隔開。
當您調用JavaScript 函數時,您正在執行該函數,也稱為調用它。要調用函數,首先添加JavaScript 函數的名稱,后跟兩個括號。為了幫助您更好地理解 JavaScript的這個組件。
如果您當前使用的是Google Chrome,請打開開發者控制臺。這將允許您練習 JavaScript 函數。要打開此開發人員控制臺,請按 Ctrl + Shift + J(對于 Windows)或Cmd + Opt + J(對于 Mac)。
首先,讓我們定義一個名為 logIt的 JavaScript 函數。這個 JavaScript 函數將有一個參數:“city”。執行完此函數后,我們將名稱記錄到控制臺中。它看起來像這樣:
如果你想調用這個函數,你可以調用它并將它傳遞給一個參數。在此示例中,JavaScript 函數名為 Dallas。它看起來像這樣:
如果您的函數沒有任何參數,則可以使用一組空括號來調用它。它看起來像這樣;
在 JavaScript 中,除非您另行指定,否則每個函數都將返回undefined。讓我們通過調用一個空的JavaScript 函數。
在上面的示例中,JavaScript 函數將返回 undefined。要自定義它將返回什么,我們可以使用關鍵字“return”,然后是我們希望它返回的值。
在上面的示例中,我們已經告訴 JavaScript 函數我們希望它返回false。調用此函數允許這種情況發生。這很重要,因為函數返回的值將返回給函數的調用者。
表達式將創建一個 JavaScript 函數,該函數將給出的一個值是什么 num 參數的兩倍的值。然后,您可以調用此 JavaScript 函數并未將返回的值保存到變量中:
注銷此測試值會返回結果為 9。關于 return 語句的另一個重要規則是它會立即停止函數。
函數本質上是一個函數對象。這是一個事實,即如果某些東西不是原始的,那么它就是一個對象。JavaScript對象用途廣泛;它甚至可以讓我們將 JavaScript 中的函數作為參數移動到另一個 JavaScript 函數。
當一個 JavaScript 函數接受另一個參數函數時,這是一個高階函數。無論您目前是否參加了會議 JavaScript 訓練營,您很可能已經在 JavaScript 使用過一個高階函數,但并沒有意識到這一點。這方面的兩個例子是Array.prototype.filter和Array.prototype.mapand。這些只是眾多高階函數中的一小部分。
總結:總而言之,JavaScript 函數是一個對象。它是子程序的一部分,其目標是完成一種特定類型的任務。一個 JavaScript 函數被提升,而一個表達式沒有。要執行 JavaScript 函數,您將調用它,這稱為調用函數。您也可以將值傳遞給函數,以便在函數中使用它,也稱為參數,而其本身的值是參數。一個函數總是會返回一個值,但是 JavaScript 中沒有返回值的函數會以未定義的形式返回。
文共2416字,預計學習時長5分鐘
圖片來源:Unsplash/Luca Bravo
函數是編程中的關鍵部件之一。這些函數可執行特定任務,并可反復調用執行。將Javascript中的函數和其他編程語言中的函數相比較,其中最大的區別在于Javascript函數為一級對象,這意味著Javascript中的函數表現類似于對象,可作為變量、數組和其他對象。
本文就定義函數的三種不同方法進行討論:
1. 函數聲明
2. 函數表達式
3. 生成器函數
1. 函數聲明
函數聲明可能是最常見的方式了。觀察如下語句:
function name (parameter) { statements }
函數聲明語句
函數由關鍵字函數、函數的強制名稱和括號內的參數組成(定義函數也可無參數)。最后,大括號內則是函數的主體,用以執行實際任務。
理解形參和實參的區別很重要。形參是定義函數時的一個變量。在調用函數時,實參則是輸入函數形參的實際數據。
首先,看一個簡單實例:
function hello(name) { console.log("Hello "+ name) } hello('stuti') // Hello stuti hello(12) // Hello 12
名為hello的函數以實際參數名稱聲明,在控制臺記錄消息。從本例中,可以看出,因為實際參數上無指定類型,所以其既適用于string函數,也適用于number函數。倘若只是希望該函數是一個名稱而不是數值呢?很遺憾,由于Javascript中沒有預建法來實現這一點,必須手動確定輸入函數的實際參數類型,如下所示:
function hello(name) { if (typeof name==='string') console.log("Hello " + name) else console.log("Please input a Name") } hello(12) // Plese input a Name
默認情況下,函數返回未定義變量。若要返回任何其他值,則函數必須具備返回語句,而由該語句指定返回值。
function something(){ } console.log(something()) // undefined function notSomething(){ return 1 } console.log(notSomething()) // 1
函數聲明中提升是什么?
簡單地說,這意味著在執行代碼時,無論何處聲明函數或變量,它們均會移動至作用域的頂部。這也就是所謂的提升。
觀察下方實例:
myName() // My name is Stuti Chahuhan function myName() { console.log(`My name is Stuti Chauhan`) }
函數聲明中的提升
此處甚至是在聲明之前就調用了這個函數——提升。
2. 函數表達式
圖片來源:unsplash.com/@creativegangsters
函數表達式與函數聲明極為相似,連語句都不甚相同。最主要的區別在于函數表達式不以關鍵字函數開頭,且函數名稱可選,在此情況下,該函數表達式則可以成為一個匿名函數。如果函數有名稱,則將其稱為命名函數表達式。
let checkNumber=function check (num){ return (num %2==0)?"even" : "odd" } console.log(checkNumber(50)) // even
函數表達式的例子
現在來觀察一下定義上述函數的匿名法。
//Anonymous Function let checkNumber=function (num){ return (num %2==0)?"even" : "odd" } console.log(checkNumber(50)) // even
匿名函數表達式
函數聲明和函數表達式最關鍵的區別就在于函數表達式無提升功能。若在函數表達式中嘗試與提升函數聲明相同的項目,則會出現報錯。
myName() // ReferenceError: myName is not defined let myName=function () { console.log(`My name is Stuti Chauhan`) }
函數表達式中無提升
IIFE(立即執行函數表達式)
這意味著函數一旦定義就開始運行,而函數表達式附在分組操作符()中,
( function () { let num=4 return num }) //4
為什么典型的函數表達式需要IIFE?一般定義一個函數,隨后多次調用。但倘若只想調用一次用來生成輸出,并且不再使用該函數呢?由此就出現了IIFE。該函數會立即執行,并在以后不再經程序訪問。因為不需再調用該函數,所以它也不需要名稱,因此匿名函數表達式首選IIFE。
3. 生成器函數
圖片來源:unsplash.com/@roman_lazygeek
普通函數遵循運行-完成的模型,不能在執行最后一行之前停止運行。若想在執行過程中退出,必須返回或拋出一個錯誤。
而生成器函數可以在執行過程中停止。當其調回時,仍然從停止的地方繼續。
該函數與普通函數一樣進行聲明,但不同之處在于生成器函數在function關鍵字后面帶有星號*,其間可包含任意數量的空格。
還有一點需要注意:在JavaScript中,生成器是一個函數,該函數返回一個對象,在該對象上可調用next(),每次調用next()都會返回一個結構如下的對象:
{ value: Any, done: true|false }
此對象包含兩個屬性:value和done。Value是對象的實際值,而done規定了函數終止的屬性——默認值為false,當其變為true時,則函數停止。
通過一個簡單的例子來理解這點:
function * generatorFunction() { console.log('first to execute'); yield 'takes a pause'; console.log(' printed after the pause'); yield 'end of the function'; } const gen=generatorFunction(); console.log(gen.next().value); // first to execute // takes a pause console.log(gen.next().value); // printed after the pause // end of the function console.log(gen.next().value); // undefined
函數本體中,不使用return關鍵字——而是使用yeild,如果使用了return,則會將done屬性更改為true,函數將結束——之后的任何操作都不會執行。Yield給出為其分配的值。
首先,在調用函數前先定義函數,同時調用一個生成器函數,形成一個生成器對象,存儲在變量中。
然后在使用next()和value屬性時調用對象。第一次使用next()時,函數執行開始。首先,運行console.log (“首次執行”)并將其記錄在控制臺中,然后遇到yield—輸出 “暫停”值,執行停止。
第二次調用next()時,它從上次暫停處繼續。同樣,首先運行console.log(),再次遇到yield,生成“函數結束”值,函數停止。
第三次調用next()時,結果是未定義。這是因為由生成器函數生成的對象只能迭代一次——該對象現在是無用的,必須生成一個新對象才能重新啟動程序。
function* generator() { yield "some value"; return "ends here"; yield "will never execute"; yield "never reach here" } var gen=generator() console.log(gen.next()); // { value: "some value", done: false } console.log(gen.next()); // { value: "ends here", done: true } console.log(gen.next()); // { value: undefined, done: true } console.log(gen.next()); // { value: undefined, done: true }
如果使用return而不是yield,那么數據的值就會被更改為true,之后就不會執行任何操作。與Promise結合使用時,就異步編程而言,生成器是一個非常強大的工具。該函數即使不能完全消除回調的問題,也可以減輕其問題的程度。
結論:哪種方法更好?
事實上,我們不能將其進行比較,然后說一個比另一個好——聲明的類型還是取決于具體情況或條件。
為實現更好的異步功能則使用生成器函數,針對立即執行函數的情況,則使用匿名函數表達式。
留言 點贊 關注
我們一起分享AI學習與發展的干貨
編譯組:柳玥、溫媛
相關鏈接:
https://medium.com/better-programming/three-ways-to-define-functions-in-javascript-750a908e51d9
如需轉載,請后臺留言,遵守轉載規范
數-function是Javascript非常重要的概念。
在寫程序的時候,你會發現在程序的不同地方會書寫相同的代碼,這個時候就需要引入函數。
譬如求一個數字是不是素數,素數的定義如下:
素數是指一個數只能被1和本身整除。
我們就可以用前面的for和if語句來寫一個函數。
函數的語法是這樣:
function name(parameters)
{
...body...
}
name是函數的名字。
parameters是函數。
body表示函數里面的代碼。
那么求一個數是不是素數的函數如下:
function isPrimer(a){
for(var i=1;i<a;i++) {
if(a%i==0) //如果可以整除
{
return false; //return也是一個語法,表示函數額返回值
}
}
return true;
}
定義完函數以后,我們就可以使用它(這段代碼我們稱為代碼1):
function isPrimer(a){
for(var i=1;i<a;i++) {
if(a%i==0) //如果可以整除
{
return false; //return也是一個語法,表示函數額返回值
}
}
return true;
}
var a1=100
if(isPrimer(a1)){
console.log("這個數是素數:"+a1);
}else{
console.log("這個數不是素數:"+a1);
}
var b1=13
if(isPrimer(b1)){
console.log("這個數是素數:"+b1);
}else{
console.log("這個數不是素數:"+b1);
}
基于上面的代碼,看到還是有些代碼是重復,我們就可以再提取一個函數,這里名字叫PrintPrimer:
function PrintPrimer(a){
if(isPrimer(a)) {
console.log("這個數是素數:"+a);
} else {
console.log("這個數不是素數:"+a);
}
}
最后我們代碼綜合在一起,就變成了這樣:
var a1=100;
var b1=13;
PrintPrimer(a1)PrintPrimer(b1)
最后是綜合例子2:
function isPrimer(a){
for(var i=1;i<a;i++) {
if(a%i==0) //如果可以整除
{
return false; //return也是一個語法,表示函數額返回值
}
}
return true;
}
function PrintPrimer(a){
if(isPrimer(a)) {
console.log("這個數是素數:"+a);
} else {
console.log("這個數不是素數:"+a);
}
}
var a1=100;
var b1=13;
PrintPrimer(a1);PrintPrimer(b1);
我們看到PrintPrimer函數可以在內部調用isPrimer函數,而且更近一步,還可以調用自身,稱為“遞歸”。
平日下面一個數字列表:
1 1 2 3 5 8 。。。。
這個數字列表的特別就是,第一和第二項為1,然后后面的數字是前面兩個數字的和。
用Javascript怎么寫這個功能呢?(代碼4)
function fab(a){
if(a==1 || a==0) //調用自身的截止條件,如果不設置,容易出現問題。
return 1;
else {
return fab(a-1)+fab(a-2); //調用自身
}
}
var fab_5=fab(5)console.log("fab(5)="+fab_5)
好了,關于JavaScript的函數今天就到這里,請大家仔細體會。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。