摘要:對象方法當(dāng)用作對象屬性時,函數(shù)稱為方法箭頭函數(shù)中的當(dāng)箭頭函數(shù)與常規(guī)函數(shù)用作對象方法時,有一個重要的行為。這是因?yàn)榈奶幚碓趦蓚€函數(shù)聲明樣式中是不同的。會將函數(shù)移動到其范圍的頂部。變量聲明被提升,但不是值,因此不是函數(shù)。
簡介
JavaScript中的所有內(nèi)容都發(fā)生在函數(shù)中。
函數(shù)是一個代碼塊,可以定義一次并隨時運(yùn)行。
函數(shù)可以選擇接受參數(shù),并返回一個值。
JavaScript中的函數(shù)是對象,一種特殊的對象:函數(shù)對象。
另外,函數(shù)被稱為第一類函數(shù),因?yàn)樗鼈兛梢员毁x值給一個值,它們可以作為參數(shù)傳遞并用作返回值。
句法讓我們從“舊的”,ES6 / ES2015之前的語法開始。這是一個函數(shù)聲明:
function dosomething(foo) { // do something }
(現(xiàn)在,在ES6 / ES2015世界中,被稱為常規(guī)函數(shù))
函數(shù)可以分配給變量(這稱為函數(shù)表達(dá)式):
const dosomething = function(foo) { // do something }
命名函數(shù)表達(dá)式類似,但在堆棧調(diào)用跟蹤中更好用,這在發(fā)生錯誤時很有用 - 它保存函數(shù)的名稱:
const dosomething = function dosomething(foo) { // do something }
ES6 / ES2015引入了箭頭函數(shù),在使用內(nèi)聯(lián)函數(shù)時,特別適合用作參數(shù)或回調(diào)函數(shù):
const dosomething = foo => { //do something }
箭頭函數(shù)與上面的其他函數(shù)定義有很大的不同,我們稍后會解釋。
參數(shù)一個函數(shù)可以有一個或多個參數(shù)。
const dosomething = () => { //do something } const dosomethingElse = foo => { //do something } const dosomethingElseAgain = (foo, bar) => { //do something }
從ES6 / ES2015開始,函數(shù)可以具有參數(shù)的默認(rèn)值:
const dosomething = (foo = 1, bar = "hey") => { //do something }
這允許您在不填充所有參數(shù)的情況下調(diào)用函數(shù):
dosomething(3) dosomething()
ES2018引入了參數(shù)的尾隨逗號,這個功能有助于減少因移動參數(shù)時丟失逗號而導(dǎo)致的錯誤(例如,移動中間的最后一個):
const dosomething = (foo = 1, bar = "hey") => { //do something } dosomething(2, "ho!")
您可以將所有參數(shù)包裝在一個數(shù)組中,并在調(diào)用函數(shù)時使用spread運(yùn)算符:
const dosomething = (foo = 1, bar = "hey") => { //do something } const args = [2, "ho!"] dosomething(...args)
當(dāng)使用許多參數(shù)的時候,記住這些參數(shù)可能很困難。這里可以使用對象,解構(gòu)保留參數(shù)名稱:
const dosomething = ({ foo = 1, bar = "hey" }) => { //do something console.log(foo) // 2 console.log(bar) // "ho!" } const args = { foo: 2, bar: "ho!" } dosomething(args)返回值
每個函數(shù)都返回一個值,默認(rèn)情況下為“undefined”。
任何函數(shù)在其代碼行結(jié)束時,或者當(dāng)執(zhí)行流找到return關(guān)鍵字時終止。
當(dāng)JavaScript遇到此關(guān)鍵字時,它退出函數(shù)執(zhí)行并將控制權(quán)交還給其調(diào)用者。
如果傳遞一個值,則該值將作為函數(shù)的結(jié)果返回:
const dosomething = () => { return "test" } const result = dosomething() // result === "test"
您只能返回一個值。
要_模擬_返回多個值,您可以返回對象文字或數(shù)組,并在調(diào)用時使用解構(gòu)賦值功能。
使用數(shù)組:
使用對象:
嵌套函數(shù)可以在其他函數(shù)中定義函數(shù):
const dosomething = () => { const dosomethingelse = () => {} dosomethingelse() return "test" }
嵌套函數(shù)的作用域是外部函數(shù),不能從外部調(diào)用。對象方法
當(dāng)用作對象屬性時,函數(shù)稱為方法:
const car = { brand: "Ford", model: "Fiesta", start: function() { console.log(Started) } } car.start()箭頭函數(shù)中的this
當(dāng)箭頭函數(shù)與常規(guī)函數(shù)用作對象方法時,有一個重要的行為。考慮這個例子:
const car = { brand: "Ford", model: "Fiesta", start: function() { console.log(Started ${this.brand} ${this.model}) }, stop: () => { console.log(Stopped ${this.brand} ${this.model}) } }
stop()方法不能像你期望的那樣工作。
這是因?yàn)閠his的處理在兩個函數(shù)聲明樣式中是不同的。箭頭函數(shù)中的this指的是封閉函數(shù)上下文,在本例中是window對象
this,使用function()引用宿主對象
這意味著箭頭函數(shù)不適合用于對象方法和構(gòu)造函數(shù)(箭頭函數(shù)構(gòu)造函數(shù)實(shí)際上會在調(diào)用時引發(fā)TypeError)。
IIFE,立即調(diào)用函數(shù)表達(dá)式IIFE是一個在聲明后立即執(zhí)行的功能:
;(function dosomething() { console.log("executed") })()
您可以將結(jié)果分配給變量:
const something = (function dosomething() { return "something" })()
它們非常方便,因?yàn)槟鸁o需在定義后多帶帶調(diào)用該函數(shù)。
Function 掛載執(zhí)行代碼之前的JavaScript會根據(jù)某些規(guī)則對其進(jìn)行重新排序。
會將函數(shù)移動到其范圍的頂部。這就是下面例子不會報錯的原因;
dosomething() function dosomething() { console.log("did something") }
在內(nèi)部,JavaScript在調(diào)用之前移動函數(shù),以及在同一范圍內(nèi)找到的所有其他函數(shù):
function dosomething() { console.log("did something") } dosomething()
現(xiàn)在,如果你使用命名函數(shù)表達(dá)式,因?yàn)槟阏谑褂米兞浚瑫l(fā)生不同的事情。變量聲明被提升,但不是值,因此不是函數(shù)。
dosomething() const dosomething = function dosomething() { console.log("did something") }
不會工作:
這是因?yàn)閮?nèi)部發(fā)生的事情是:
const dosomething dosomething() dosomething = function dosomething() { console.log("did something") }
“l(fā)et”聲明也是如此。var聲明也不起作用,但是報的不是同樣的錯誤:
這是因?yàn)?b>var聲明被提升并用undefined作為值初始化,而const和let被提升但未初始化。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/97217.html
摘要:對象方法當(dāng)用作對象屬性時,函數(shù)稱為方法箭頭函數(shù)中的當(dāng)箭頭函數(shù)與常規(guī)函數(shù)用作對象方法時,有一個重要的行為。這是因?yàn)榈奶幚碓趦蓚€函數(shù)聲明樣式中是不同的。會將函數(shù)移動到其范圍的頂部。變量聲明被提升,但不是值,因此不是函數(shù)。 簡介 JavaScript中的所有內(nèi)容都發(fā)生在函數(shù)中。 函數(shù)是一個代碼塊,可以定義一次并隨時運(yùn)行。 函數(shù)可以選擇接受參數(shù),并返回一個值。 JavaScript中的函數(shù)是對...
摘要:以下例子的目的是使用來展示一個每秒都會更新的時鐘當(dāng)嘗試在的回調(diào)中使用來引用元素時,很不幸,我們得到的只是一個屬于回調(diào)函數(shù)自身上下文的。 前言 胖箭頭函數(shù)(Fat arrow functions),又稱箭頭函數(shù),是一個來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞?wù)f,箭頭函數(shù)的語法=>,是受到了CoffeeScript 的影響,并且它與CoffeeScript中的=>...
摘要:回顧我們先來回顧下箭頭函數(shù)的基本語法。主要區(qū)別包括沒有箭頭函數(shù)沒有,所以需要通過查找作用域鏈來確定的值。箭頭函數(shù)并沒有方法,不能被用作構(gòu)造函數(shù),如果通過的方式調(diào)用,會報錯。 回顧 我們先來回顧下箭頭函數(shù)的基本語法。 ES6 增加了箭頭函數(shù): let func = value => value; 相當(dāng)于: let func = function (value) { return ...
摘要:注意箭頭函數(shù)有幾個使用注意點(diǎn)不可以使用對象,該對象在函數(shù)體內(nèi)不存在。不可以當(dāng)作構(gòu)造函數(shù),也就是說,不可以使用命令,否則會拋出一個錯誤。不可以使用命令,因此箭頭函數(shù)不能用作函數(shù)。 前言 在JavaScript的世界中函數(shù)被譽(yù)為一等公民,每當(dāng)我們需要在JS定義一個新的函數(shù),我們都會毫不猶豫的function() {},也許我們可以開始換一種方式來定義一個函數(shù),也就是本文的主角箭頭函數(shù),一個...
摘要:改動函數(shù)的改變不算太大,都是一些其他語言早就有的功能,而一直比較欠缺的,比如函數(shù)參數(shù)默認(rèn)值,任意參數(shù)的表示法,最大的變化應(yīng)該是支持箭頭函數(shù)其他語言稱之為表達(dá)式,一種對匿名函數(shù)的一種簡寫方式,以下來探討一下函數(shù)在中的一些改變默認(rèn)參數(shù)任意參數(shù)操 ES6 functions改動 ????ES6函數(shù)的改變不算太大,都是一些其他語言早就有的功能,而Javascript一直比較欠缺的,比如函數(shù)參數(shù)...
閱讀 1019·2022-07-19 10:19
閱讀 1794·2021-09-02 15:15
閱讀 1007·2019-08-30 15:53
閱讀 2653·2019-08-30 13:45
閱讀 2651·2019-08-26 13:57
閱讀 1983·2019-08-26 12:13
閱讀 1006·2019-08-26 10:55
閱讀 545·2019-08-26 10:46