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