摘要:函數(shù)的擴(kuò)展函數(shù)參數(shù)的默認(rèn)值之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法。箭頭函數(shù)引入了一種新的函數(shù),叫做箭頭函數(shù)。箭頭函數(shù)和普通函數(shù)的行為非常相似,但是在語法構(gòu)成上非常不同。意味著函數(shù)內(nèi)的的值是全局對象,不是對象。
函數(shù)的擴(kuò)展 函數(shù)參數(shù)的默認(rèn)值
ES6 之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法。
function log(x, y) { y = y || "World"; console.log(x, y); }
上面代碼檢查函數(shù)log的參數(shù)y有沒有賦值,如果沒有,則指定默認(rèn)值為World。這種寫法的缺點(diǎn)在于,如果參數(shù)y賦的值對應(yīng)的布爾值為false,則該賦值不起作用。
function greet(name, greeting) { name = (typeof name !== "undefined") ? name : "Student"; greeting = (typeof greeting !== "undefined") ? greeting : "Welcome"; return `${greeting} ${name}!`; } greet(); // Welcome Student! greet("James"); // Welcome James! greet("Richard", "Howdy"); // Howdy Richard!
為了避免這個(gè)問題,通常需要先判斷一下參數(shù)y是否被賦值,如果沒有,再等于默認(rèn)值。
if (typeof y === "undefined") { y = "World"; }
ES6 允許為函數(shù)的參數(shù)設(shè)置默認(rèn)值,即直接寫在參數(shù)定義的后面。
function log(x, y = "World") { console.log(x, y); } log("Hello") // Hello World剩余參數(shù)
剩余參數(shù)也用三個(gè)連續(xù)的點(diǎn) ( ... ) 表示,使你能夠?qū)⒉欢〝?shù)量的元素表示為數(shù)組。與解構(gòu)賦值結(jié)合
剩余參數(shù)可以與解構(gòu)賦值結(jié)合起來,用于生成數(shù)組。
const [first, ...rest] = [1, 2, 3, 4, 5]; first // 1 rest // [2, 3, 4, 5]
可以將剩余參數(shù)看著展開運(yùn)算符的對立面;如果展開運(yùn)算符是拿出包裝盒中的所有物品,那么剩余參數(shù)就是將所有物品放回包裝盒中。
可變參數(shù)函數(shù)剩余參數(shù)的另一個(gè)用例是處理可變參數(shù)函數(shù)。可變參數(shù)函數(shù)是接受不定數(shù)量參數(shù)的函數(shù)。
例如,假設(shè)有一個(gè)叫做 sum() 的函數(shù),它會(huì)計(jì)算不定數(shù)量的數(shù)字的和。在運(yùn)行期間,如何調(diào)用 sum() 函數(shù)?
sum(1, 2); sum(10, 36, 7, 84, 90, 110); sum(-23, 3000, 575000);
實(shí)際上有無數(shù)種方式可以調(diào)用 sum() 函數(shù)。不管傳入函數(shù)的數(shù)字有多少個(gè),應(yīng)該始終返回?cái)?shù)字的總和。
使用參數(shù)對象
在之前版本的 JavaScript 中,可以使用參數(shù)對象處理這種類型的函數(shù)。參數(shù)對象是像數(shù)組一樣的對象,可以當(dāng)做本地變量在所有函數(shù)中使用。它針對傳入函數(shù)的每個(gè)參數(shù)都包含一個(gè)值,第一個(gè)參數(shù)從 0 開始,第二個(gè)參數(shù)為 1,以此類推。
function sum() { let total = 0; for(const argument of arguments) { total += argument; } return total; }
現(xiàn)在可以正常運(yùn)行,但是存在問題:
如果查看 sum() 函數(shù)的定義,會(huì)發(fā)現(xiàn)它沒有任何參數(shù)。這容易引起誤導(dǎo),因?yàn)槲覀冎?sum() 函數(shù)可以處理不定數(shù)量的參數(shù)。
難以理解。
如果你從未使用過參數(shù)對象,那么看了這段代碼后很可能會(huì)疑問參數(shù)對象來自何處。是不是憑空出現(xiàn)的?看起來肯定是這樣。
使用剩余參數(shù)
function sum(...nums) { let total = 0; for(const num of nums) { total += num; } return total; }
注意,rest 參數(shù)之后不能再有其他參數(shù)(即只能是最后一個(gè)參數(shù)),否則會(huì)報(bào)錯(cuò)。箭頭函數(shù)
ES6 引入了一種新的函數(shù),叫做箭頭函數(shù)。箭頭函數(shù)和普通函數(shù)的行為非常相似,但是在語法構(gòu)成上非常不同。
普通函數(shù)可以是函數(shù)聲明或函數(shù)表達(dá)式,但是箭頭函數(shù)始終是表達(dá)式。實(shí)際上,它們的全稱是“箭頭函數(shù)表達(dá)式”
//普通函數(shù) const upperizedNames = ["Farrin", "Kagure", "Asser"].map(function(name) { return name.toUpperCase(); }); //箭頭函數(shù) const upperizedNames = ["Farrin", "Kagure", "Asser"].map( name => name.toUpperCase() );
如果箭頭函數(shù)不需要參數(shù)或需要多個(gè)參數(shù),就使用一個(gè)圓括號代表參數(shù)部分。
var f = () => 5; // 等同于 var f = function () { return 5 }; var sum = (num1, num2) => num1 + num2; // 等同于 var sum = function(num1, num2) { return num1 + num2; };
如果箭頭函數(shù)的代碼塊部分多于一條語句,就要使用大括號將它們括起來,并且使用return語句返回。
var sum = (num1, num2) => { return num1 + num2; }箭頭函數(shù)中的this
對于普通函數(shù),this 的值基于函數(shù)如何被調(diào)用。對于箭頭函數(shù),this 的值基于函數(shù)周圍的上下文。換句話說,箭頭函數(shù)內(nèi)的,this 的值與函數(shù)外面的 this 的值一樣。
我們先看一個(gè)普通函數(shù)中的 this 示例,再看一個(gè)箭頭函數(shù)是如何使用 this 的。
// constructor function IceCream() { this.scoops = 0; } // adds scoop to ice cream IceCream.prototype.addScoop = function() { setTimeout(function() { this.scoops++; console.log("scoop added!"); }, 500); }; const dessert = new IceCream(); dessert.addScoop();
運(yùn)行上述代碼后,你會(huì)認(rèn)為半毫秒之后,dessert.scoops 會(huì)是1。但并非這樣:結(jié)果是NaN
這是因?yàn)閭鬟f給 setTimeout() 的函數(shù)被調(diào)用時(shí)沒用到 new、call() 或 apply(),也沒用到上下文對象。意味著函數(shù)內(nèi)的 this 的值是全局對象,不是 dessert 對象。實(shí)際上發(fā)生的情況是,創(chuàng)建了新的 scoops 變量(默認(rèn)值為 undefined),然后遞增(undefined + 1 結(jié)果為 NaN)
// constructor function IceCream() { this.scoops = 0; } // adds scoop to ice cream IceCream.prototype.addScoop = function() { setTimeout(() => { // an arrow function is passed to setTimeout this.scoops++; console.log("scoop added!"); }, 0.5); }; const dessert = new IceCream(); console.log(dessert.scoops); //1
因?yàn)榧^函數(shù)從周圍上下文繼承了 this 值,所以這段代碼可行!
如果我們將 addScoop() 方法也改為箭頭函數(shù),你認(rèn)為會(huì)發(fā)生什么?
// constructor function IceCream() { this.scoops = 0; } // adds scoop to ice cream IceCream.prototype.addScoop = () => { // addScoop is now an arrow function setTimeout(() => { this.scoops++; console.log("scoop added!"); }, 0.5); }; const dessert = new IceCream(); dessert.addScoop();
這段代碼因?yàn)橥辉蚨黄鹱饔茫醇^函數(shù)從周圍上下文中繼承了 this 值。在 addScoop() 方法外面,this 的值是全局對象。因此如果 addScoop() 是箭頭函數(shù),addScoop() 中的 this 的值是全局對象。這樣的話,傳遞給 setTimeout() 的函數(shù)中的 this 的值也設(shè)為了該全局對象!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/90680.html
摘要:它是一個(gè)通用標(biāo)準(zhǔn),奠定了的基本語法。年月發(fā)布了的第一個(gè)版本,正式名稱就是標(biāo)準(zhǔn)簡稱。結(jié)語的基本擴(kuò)展還有一些沒有在這里詳細(xì)介紹。 前言 ES6標(biāo)準(zhǔn)以及頒布兩年了,但是,好像還沒有完全走進(jìn)我們的日常開發(fā)。這篇文章從ES6的基本類型擴(kuò)展入手,逐步展開對ES6的介紹。 ECMAScript和JavaScript JavaScript是由Netscape創(chuàng)造的,該公司1996年11月將JavaSc...
摘要:模板字符串連接符在之前,將字符串連接到一起的舊方法是使用字符串連接運(yùn)算符。這樣更容易構(gòu)建字符串。返回布爾值,表示參數(shù)字符串是否在原字符串的頭部。它針對前個(gè)字符,而其他兩個(gè)方法針對從第個(gè)位置直到字符串結(jié)束。 模板字符串 + 連接符 在 ES6 之前,將字符串連接到一起的舊方法是使用字符串連接運(yùn)算符 (+)。 const student = { name: Richard Kaleho...
摘要:導(dǎo)入模塊的代碼執(zhí)行后,實(shí)例化過的模塊被保存在內(nèi)存中,只要另一個(gè)語句引用它就可以重復(fù)使用它和的一個(gè)重要的限制是它們必須在其它語句和函數(shù)之外使用,也就是說不允許出現(xiàn)在語句中,不能有條件導(dǎo)出或以任何方式動(dòng)態(tài)導(dǎo)出。 什么是模塊 模塊是自動(dòng)運(yùn)行在嚴(yán)格模式下并且沒有辦法退出運(yùn)行的Javascript代碼 在模塊的頂部this的值是undefined 其模塊不支持html風(fēng)格的代碼注釋除非用def...
摘要:導(dǎo)入模塊的代碼執(zhí)行后,實(shí)例化過的模塊被保存在內(nèi)存中,只要另一個(gè)語句引用它就可以重復(fù)使用它和的一個(gè)重要的限制是它們必須在其它語句和函數(shù)之外使用,也就是說不允許出現(xiàn)在語句中,不能有條件導(dǎo)出或以任何方式動(dòng)態(tài)導(dǎo)出。 什么是模塊 模塊是自動(dòng)運(yùn)行在嚴(yán)格模式下并且沒有辦法退出運(yùn)行的Javascript代碼 在模塊的頂部this的值是undefined 其模塊不支持html風(fēng)格的代碼注釋除非用def...
閱讀 2197·2021-11-15 11:38
閱讀 1160·2021-09-06 15:02
閱讀 3396·2021-08-27 13:12
閱讀 1362·2019-08-30 14:20
閱讀 2400·2019-08-29 15:08
閱讀 646·2019-08-29 14:08
閱讀 1730·2019-08-29 13:43
閱讀 1467·2019-08-26 12:11