成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

es6中箭頭函數和普通函數的區別是什么

區別:1、箭頭函數的定義要比普通函數定義簡潔、清晰得多,很快捷;2、箭頭函數不會創建自己的this,而普通函數會;3、箭頭函數不能作為構造函數使用,而箭頭函數能作為構造函數使用;4、箭頭函數沒有自己的arguments,而箭頭函數有。

es6中箭頭函數和普通函數的區別是什么

本教程操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

箭頭函數是前端面試環節的一個高頻考點,箭頭函數是ES6的API,相信很多人都知道,因為它的語法比一般的函數更簡潔,所以深受大家的喜愛。

一、基本語法

ES6中允許使用箭頭=>來定義箭頭函數,具體語法,我們來看一個簡單的例子:

// 箭頭函數 let fun = (name) => {     // 函數體     return `Hello ${name} !`; };  // 等同于 let fun = function (name) {     // 函數體     return `Hello ${name} !`; };

可以看出,定義箭頭函在數語法上要比普通函數簡潔得多。箭頭函數省去了function關鍵字,采用箭頭=>來定義函數。函數的參數放在=>前面的括號中,函數體跟在=>后的花括號中。

關于箭頭函數的參數:

如果箭頭函數沒有參數,直接寫一個空括號即可。

如果箭頭函數的參數只有一個,也可以省去包裹參數的括號。

如果箭頭函數有多個參數,將參數依次用逗號(,)分隔,包裹在括號中即可。

// 沒有參數 let fun1 = () => {     console.log(111); };  // 只有一個參數,可以省去參數括號 let fun2 = name => {     console.log(`Hello ${name} !`) };  // 有多個參數 let fun3 = (val1, val2, val3) => {     return [val1, val2, val3]; };

關于箭頭函數的函數體:

如果箭頭函數的函數體只有一句代碼,就是簡單返回某個變量或者返回一個簡單的JS表達式,可以省去函數體的大括號{ }。

let f = val => val; // 等同于 let f = function (val) { return val };  let sum = (num1, num2) => num1 + num2; // 等同于 let sum = function(num1, num2) {   return num1 + num2; };

如果箭頭函數的函數體只有一句代碼,就是返回一個對象,可以像下面這樣寫:

// 用小括號包裹要返回的對象,不報錯 let getTempItem = id => ({ id: id, name: "Temp" });  // 但絕不能這樣寫,會報錯。 // 因為對象的大括號會被解釋為函數體的大括號 let getTempItem = id => { id: id, name: "Temp" };

如果箭頭函數的函數體只有一條語句并且不需要返回值(最常見是調用一個函數),可以給這條語句前面加一個void關鍵字

let fn = () => void doesNotReturn();

箭頭函數最常見的用處就是簡化回調函數。

// 例子一 // 正常函數寫法 [1,2,3].map(function (x) {   return x * x; });  // 箭頭函數寫法 [1,2,3].map(x => x * x);  // 例子二 // 正常函數寫法 var result = [2, 5, 1, 4, 3].sort(function (a, b) {   return a - b; });  // 箭頭函數寫法 var result = [2, 5, 1, 4, 3].sort((a, b) => a - b);

二、箭頭函數與普通函數的區別

1、語法更加簡潔、清晰

從上面的基本語法示例中可以看出,箭頭函數的定義要比普通函數定義簡潔、清晰得多,很快捷。

2、箭頭函數不會創建自己的this(重要!!深入理解!!)

我們先來看看MDN上對箭頭函數this的解釋。

箭頭函數不會創建自己的this,所以它沒有自己的this,它只會從自己的作用域鏈的上一層繼承this

箭頭函數沒有自己的this,它會捕獲自己在定義時(注意,是定義時,不是調用時)所處的外層執行環境的this,并繼承這個this值。所以,箭頭函數中this的指向在它被定義的時候就已經確定了,之后永遠不會改變。

來看個例子:

var id = 'Global';  function fun1() {     // setTimeout中使用普通函數     setTimeout(function(){         console.log(this.id);     }, 2000); }  function fun2() {     // setTimeout中使用箭頭函數     setTimeout(() => {         console.log(this.id);     }, 2000) }  fun1.call({id: 'Obj'});     // 'Global'  fun2.call({id: 'Obj'});     // 'Obj'

上面這個例子,函數fun1中的setTimeout中使用普通函數,2秒后函數執行時,這時函數其實是在全局作用域執行的,所以this指向Window對象,this.id就指向全局變量id,所以輸出'Global'。 但是函數fun2中的setTimeout中使用的是箭頭函數,這個箭頭函數的this在定義時就確定了,它繼承了它外層fun2的執行環境中的this,而fun2調用時thiscall方法改變到了對象{id: 'Obj'}中,所以輸出'Obj'

再來看另一個例子:

var id = 'GLOBAL'; var obj = {   id: 'OBJ',   a: function(){     console.log(this.id);   },   b: () => {     console.log(this.id);   } };  obj.a();    // 'OBJ' obj.b();    // 'GLOBAL'

上面這個例子,對象obj的方法a使用普通函數定義的,普通函數作為對象的方法調用時,this指向它所屬的對象。所以,this.id就是obj.id,所以輸出'OBJ'。 但是方法b是使用箭頭函數定義的,箭頭函數中的this實際是繼承的它定義時所處的全局執行環境中的this,所以指向Window對象,所以輸出'GLOBAL'。(這里要注意,定義對象的大括號{}是無法形成一個單獨的執行環境的,它依舊是處于全局執行環境中!!

3、箭頭函數繼承而來的this指向永遠不變(重要!!深入理解!!)

上面的例子,就完全可以說明箭頭函數繼承而來的this指向永遠不變。對象obj的方法b是使用箭頭函數定義的,這個函數中的this永遠指向它定義時所處的全局執行環境中的this,即便這個函數是作為對象obj的方法調用,this依舊指向Window對象。

4、.call()/.apply()/.bind()無法改變箭頭函數中this的指向

.call()/.apply()/.bind()方法可以用來動態修改函數執行時this的指向,但由于箭頭函數的this定義時就已經確定且永遠不會改變。所以使用這些方法永遠也改變不了箭頭函數this的指向,雖然這么做代碼不會報錯。

var id = 'Global'; // 箭頭函數定義在全局作用域 let fun1 = () => {     console.log(this.id) };  fun1();     // 'Global' // this的指向不會改變,永遠指向Window對象 fun1.call({id: 'Obj'});     // 'Global' fun1.apply({id: 'Obj'});    // 'Global' fun1.bind({id: 'Obj'})();   // 'Global'

5、箭頭函數不能作為構造函數使用

我們先了解一下構造函數的new都做了些什么?簡單來說,分為四步: ① JS內部首先會先生成一個對象; ② 再把函數中的this指向該對象; ③ 然后執行構造函數中的語句; ④ 最終返回該對象實例。

但是!!因為箭頭函數沒有自己的this,它的this其實是繼承了外層執行環境中的this,且this指向永遠不會隨在哪里調用、被誰調用而改變,所以箭頭函數不能作為構造函數使用,或者說構造函數不能定義成箭頭函數,否則用new調用時會報錯!

let Fun = (name, age) => {     this.name = name;     this.age = age; };  // 報錯 let p = new Fun('cao', 24);

6、箭頭函數沒有自己的arguments

箭頭函數沒有自己的arguments對象。在箭頭函數中訪問arguments實際上獲得的是外層局部(函數)執行環境中的值。

// 例子一 let fun = (val) => {     console.log(val);   // 111     // 下面一行會報錯     // Uncaught ReferenceError: arguments is not defined     // 因為外層全局環境沒有arguments對象     console.log(arguments);  }; fun(111);  // 例子二 function outer(val1, val2) {     let argOut = arguments;     console.log(argOut);    // ①     let fun = () => {         let argIn = arguments;         console.log(argIn);     // ②         console.log(argOut === argIn);  // ③     };     fun(); } outer(111, 222);

上面例子二,①②③處的輸出結果如下:

es6中箭頭函數和普通函數的區別是什么

很明顯,普通函數outer內部的箭頭函數fun中的arguments對象,其實是沿作用域鏈向上訪問的外層outer函數的arguments對象。

可以在箭頭函數中使用rest參數代替arguments對象,來訪問箭頭函數的參數列表!!

7、箭頭函數沒有原型prototype

let sayHi = () => {     console.log('Hello World !') }; console.log(sayHi.prototype); // undefined

8、箭頭函數不能用作Generator函數,不能使用yeild關鍵字

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
50妺妺窝人体色聚窝窝www| 2022国产在线无码精品| 亚洲日韩在线成人AV电影网站| 亚洲欧美色国产综合| 伊人久久东京AV| A∨色狠狠一区二区三区| 锕锕锕锕锕锕锕好痛免费网址 | 日本理论片和搜子同居的日子| 色噜噜狠狠色综合无码AV天堂| 无码人妻黑人中文字幕| 亚洲AV乱码久久精品蜜桃| 亚洲欧美日韩久久精品第一区 | 美女裸体18禁免费网站| 欧洲美熟女乱又伦免费视频| 天堂VA欧美ⅤA亚洲VA老司机| 亚洲AV本道一区二区三区四区| 亚洲一区二区无码成人AV| AV无码久久久久不卡网站下载| 丁香色欲久久久久久综合网| 国产中年熟女高潮大集合| 久久久久久精品免费免费HD| 欧美日韩不卡高清在线看| 四虎库影必出精品8848| 亚洲国产欧美日韩精品一区二区三| 中文字幕爆乳巨爆乳系列无码| 成人区人妻精品一区二区不卡| 国产口爆吞精在线视频| 久久中文字幕无码专区 | YW尤物AV无码国产在线观看 | 午夜DY888国产精品影院| 亚洲色精品VR一区二区三区| 18岁日韩内射颜射午夜久久成人| 成人国产一区二区三区精品不卡 | 欧美最猛黑人xxxx黑人猛交| 无码夜色一区二区三区| 在线V观看免费国岛国片| 儿子比老公更大更硬朗| 精品人体无码一区二区三区| 人妻少妇看A偷人无码精品视频 | 天堂久久天堂AV色综合| 亚洲一线产区二线产区| 差差漫画在线观看登录页面弹窗 | 久久精品一区二区三区中文字幕| 清纯校花挨脔日常H惩罚视频| 亚洲AV高清在线观看一区二区| 中文字幕亚洲精品无码| 国产极品美女高潮无套在线观看 | 国产乱人伦APP精品久久| 胯下粗长挺进人妻体内电影| 少女たちよ在线观看完整版动漫 | 麻豆国产AV超爽剧情系列| 丝袜老师办公室里做好紧好爽| 一二三四在线看日本高清| 国产AV无码专区亚汌A√| 老奶奶能叫WOMAN吗| 无码精品人妻一区二区三区网站 | 日韩AV无码一区二区三区不卡| 亚洲蜜桃无码视頻精品网| 吃了继兄开的药我做的梦更| 久久久久亚洲AV无码专区首页网| 色优久久久久综合网鬼色| 一本久久知道综合久久 | 无码VR最新无码AV专区| 最新亚洲人成无码网WWW电影| 国产精成人品日日拍夜夜免费| 免费看成熟丰满少妇AⅤ无码精品| 特级毛片A级毛片免费播放| 一边下奶一边吃面膜视频| 国产大屁股喷水视频在线观看| 男男GV白嫩小受GV在线播放| 亚洲AⅤ精品无码一区二区PRO| 把女的下面扒开添视频 | 日韩激情无码不卡码| 影音先锋手机AV资源站| 国产欧美强奸激情| 人妻少妇精品视频aaa| 亚洲综合无码久久精品综合| 国产精品美女久久久久久久| 强制高潮18XXXXHD日韩| 亚洲伊人伊成久久人综合网| 国产精品一国产精品| 日本婷婷色色电影| 中文字幕日韩一区二区三区不卡 | 日韩精品无码AV成人观看| 又大又长粗又爽又黄少妇毛片| 国产三级农村妇女在线| 日产精品一线二线三线京东| 制服丝袜中文字幕在线| 交换朋友夫妻客厅互换4韩国| 熟女性饥渴一区二区三区| PITBULL的妻子| 没有被爱过的女人| 亚洲一本大道无码AV天堂| 国产无遮挡又黄又大又爽| 四虎AV永久在线精品免费观看| XXXXBBBB欧美残疾人| 免费播放AV网站的地址| 亚洲午夜成人精品无码色欲| 国色天香精品一卡2卡3卡老狼| 天天躁夜夜躁很很躁| 赤裸羔羊Ⅲ致命快感| 免费视频片多多视频免费高清| 性荡视频播放在线视频7777| 乖我们换个姿态再来一遍吧的小说| 欧美中日韩免费观看网站| 2021亚洲无码| 乱人伦中文字幕在线视频| 亚洲综合无码一区二区三区不卡| 好吊色欧美一区二区三区视频| 无码男男作爱G片在线观看| 高潮爽死抽搐白浆GIF视频| 日本丰满少妇毛茸茸| XXXXXHD亚洲日本HD| 欧美极品少妇XXXXⅩ猛交| 中文字幕久久久久人妻中出| 久久久久亚洲AV成人无码网站| 亚洲AV无码精品国产成人| 国产好大好硬好爽免费不卡| 日本熟妇人妻中出| 成人观看免费毛片爽| 人妻中文字幕制服丝袜| 锕锕锕锕锕锕好多水APP网站| 欧美劲爆精品白浆视频网站| 最新国产精品久久精品| 免费无码又爽又刺激软件下载直播 | 啪啪无码人妻丰满熟妇| CHINESE熟女老女人HD,| 欧美日韩人妻精品一区二区三区| 67194人成免费无码| 免费看行情的网站| 51成品网站W灬源码16| 男人扒开女人下面猛进猛出| 88久久精品无码一区二区毛片| 欧精国精产品一区| 99久久久无码国产精品秋霞网| 欧美无MATE30PRO巨| らだ天堂√在线WWW| 日韩精品专区在线影院重磅| 俄罗斯性孕妇孕交| 无码人妻一区二区三区免费看成人 | 中文字幕乱偷无码av先锋蜜桃| 久久久久亚洲AV成人网人人| 亚洲MV砖码砖区2021在线| 国产专区一线二线三线品牌| 无码熟熟妇丰满人妻啪啪| 国产日产欧产美韩系列| 亚洲AV成人片无码网站网一区| 精产国品一二三产品在哪| 亚洲欭美日韩颜射在线| 免费国产黄网站在线观看视频 | 国产午夜成人无码免费看不卡| 亚洲AV无码乱码国产精品| 精品国产一区二区三区免费| 亚洲性无码一区二区三区| 免费中国大但人文艺术在线观看| 2021韩剧在线观看韩剧网| 人妻无码一区二区三区蜜桃| 抖抈APP免费下载国际版| 无码人妻精品一区二区三区99不卡 | 暗呦交小U女国产精品视频| 舌尖伸入湿嫩蜜汁呻吟| 黑人巨大精品欧美一区二区| 亚洲综合AV在线在线播放 | Chinese辽宁人妻4p| 深入浅出糙汉X软妹V1V| 国内精品伊人久久久影视| 亚洲一区二区三区无码久久| 理论片午午伦夜理片1| 啊灬啊灬啊灬快灬高潮了女| 少妇人妻激情乱人伦| 极品少妇流白浆草莓视频| 曰批视频免费看30分钟| 人妻少妇中文字幕久久| 国产精品涩涩涩视频网站| 亚洲XXX午休国产熟女屁| 久久人人爽人人爽人人片AV高清| CHINESE玩弄老年熟女| 天堂中文最新版在线官网在线| 精产国品一二三产区区别在哪儿| 18禁全彩肉肉无遮挡| 四虎成人WWW成人影院| 精品国产福利在线观看| 99国产欧美久久久精品蜜桃| 天堂资源在线官网BT| 久久久久久久精品无码Av少妇 | 日本JAPANESE护士人妻| 国产精品一区二区水蜜桃色欲| 亚洲伊人久久大香线蕉AV| 让少妇高潮无乱码高清在线观看| 国产乱人伦偷精品视频色欲 | 亚洲国产精品特色大片观看完整版| 门卫老头吮她的花蒂| 国产 | 欧洲野花视频欧洲1| 亚洲一区无码中文字幕| 日本肉体XXXX裸交| 好儿子你插得太深了| WWW久久久天天COM| 亚洲AV无码成人网站WWW| 农村野外性BBW| 国产超碰人人做人人爽AV大片 |