gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

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

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號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
999在线观看视频| 91福利免费观看| 天堂在线一区二区三区| 成人午夜精品久久久久久久蜜臀| 天天爽天天爽夜夜爽| 99热一区二区三区| 五月婷婷六月丁香激情| av观看免费在线| 国产性生活一级片| 色悠悠久久综合网| 色婷婷综合在线观看| 毛毛毛毛毛毛毛片123| 国产成人无码a区在线观看视频| 国产美女视频免费看| 日韩人妻精品无码一区二区三区| 亚洲av综合色区| 亚洲最大天堂网| 亚洲一区二区在线视频观看| 手机看片福利日韩| 99热这里只有精品在线播放| 免费av网址在线| www.日本xxxx| xxww在线观看| 久久香蕉视频网站| 黄色三级中文字幕| 成 年 人 黄 色 大 片大 全| a级黄色小视频| 青青视频在线播放| 亚洲综合在线网站| 青青在线视频免费观看| 91精品91久久久中77777老牛| 成人观看免费完整观看| 免费黄色一级网站| 日本免费黄色小视频| 日韩中字在线观看| 日本超碰在线观看| 337p亚洲精品色噜噜狠狠p| 成人在线看视频| 超碰97在线看| 日韩av在线中文| 亚洲熟妇av一区二区三区漫画| 99re精彩视频| 日本xxxxxxxxxx75| 红桃视频一区二区三区免费| 老太脱裤让老头玩ⅹxxxx| 中文字幕视频三区| caopor在线视频| 日韩少妇内射免费播放| 国产盗摄视频在线观看| 成人午夜激情av| 男人舔女人下面高潮视频| 欧美一区二区三区综合| 艳母动漫在线观看| 亚洲 欧美 日韩系列| 黄色www网站| 久久国产精品网| 免费人成自慰网站| 亚洲不卡中文字幕无码| 国产美女主播在线播放| 亚洲精品少妇一区二区| 亚洲国产精品影视| 波多野结衣 作品| 和岳每晚弄的高潮嗷嗷叫视频| 国产香蕉一区二区三区| 老子影院午夜伦不卡大全| 精品国产av无码一区二区三区| 激情五月五月婷婷| 欧美性大战久久久久xxx| 能在线观看的av| 九九热免费在线观看| 精品少妇人妻av一区二区| 国产一二三区在线播放| 国产日产欧美视频| 热这里只有精品| 成人中文字幕av| 免费在线观看污网站| 欧美午夜性视频| 国产5g成人5g天天爽| 日日摸日日碰夜夜爽av| 日本高清视频免费在线观看| av网站在线不卡| 亚洲精品国产suv一区88| 91人人澡人人爽人人精品| 日韩精品免费一区| 天堂网成人在线| 依人在线免费视频| 国产视频一区二区三区在线播放| 狠狠干视频网站| 视频一区二区视频| 成品人视频ww入口| 国产成人手机视频| 精品一二三四五区| 手机在线免费毛片| 国产又粗又长又大的视频| 久久久久久久久久网| 涩多多在线观看| 天天干在线影院| 国产视频在线视频| 激情六月丁香婷婷| 欧洲熟妇精品视频| 亚洲综合色在线观看| 五月婷婷之综合激情| 天天综合网久久| 欧美xxxxxbbbbb| 亚洲啊啊啊啊啊| 国产婷婷一区二区三区| 欧美日韩在线中文| 国产xxxxx视频| 天美一区二区三区| 大陆极品少妇内射aaaaaa| 久久99国产精品一区| 超碰成人免费在线| 最近中文字幕一区二区| 亚洲涩涩在线观看| 成年人看的毛片| 波多野结衣国产精品| 青草网在线观看| 中文字幕国内自拍| 欧美极品欧美精品欧美图片| 成人午夜激情av| 久久久久久久午夜| 在线观看中文av| 国自产拍偷拍精品啪啪一区二区| 亚洲免费一级视频| 国产一线二线三线女| 四虎1515hh.com| 亚洲欧美一区二区三区不卡| 日本毛片在线免费观看| 天堂8在线天堂资源bt| 日韩av片免费观看| 国产在线观看福利| 欧美日韩在线中文| 北条麻妃69av| 人妻熟女一二三区夜夜爱| 黄网站色视频免费观看| 亚洲av综合色区| 日本男女交配视频| 岛国大片在线播放| 日本精品一区二区三区四区 | 福利视频一二区| 欧洲精品在线播放| 九九爱精品视频| 黄色一级免费大片| 超碰免费在线公开| 久久精品在线免费视频| 色乱码一区二区三区熟女| 四虎永久免费网站| 国产午夜福利视频在线观看| 少妇性饥渴无码a区免费| 在线看的黄色网址| 99热这里只有精品7| 可以在线看的av网站| 99亚洲精品视频| 国产黄色一级网站| 日本黄大片一区二区三区| 中国女人做爰视频| 三年中国国语在线播放免费| 水蜜桃在线免费观看| 久久久精品麻豆| 国产淫片免费看| 精品免费久久久久久久| the porn av| 日本老熟妇毛茸茸| 91九色在线观看视频| 警花观音坐莲激情销魂小说| 日韩精品免费播放| 国产a级片网站| 国产av熟女一区二区三区| 制服丝袜中文字幕第一页| 成人免费在线观看视频网站| www污在线观看| 久久这里只有精品8| 91精品国产吴梦梦| 日本免费成人网| 日韩专区第三页| 天天做天天躁天天躁| 高清无码一区二区在线观看吞精| 极品粉嫩美女露脸啪啪| 日韩av片免费观看| 国产性生活免费视频| 日韩视频一二三| 成人国产在线看| 日韩av资源在线| 国产精品自在自线| 国产情侣第一页| 亚洲精品自拍网| 免费视频爱爱太爽了| 国产成人无码一二三区视频| 久久精品视频91| 国产激情片在线观看| 国产精品69久久久| 国产喷水theporn| 日韩极品视频在线观看| 免费在线激情视频| 成人手机在线播放| 日日噜噜噜噜久久久精品毛片| 91香蕉国产线在线观看| 国产老熟妇精品观看| 最近免费观看高清韩国日本大全| 成年人午夜免费视频|