成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院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號
亚洲欧洲日韩综合色天使| 中国高清WINDOWS视频软件| 国内国精产品一二三区传媒| 国产欧美精品一区二区三区| WWW爱射网站AVCOM| 亚洲AV永久无码精品一区二区国| 翘臀后进呻吟喷水的少妇| 人妻人人爽人人澡人人喊| 色偷一区国产精品| 无人区乱码一线忘忧草| 亚洲精品成A人在线观看| 伊人久久综合无码成人网| 69成人免费视频无码专区| 办公室揉弄高潮嗯啊免费视频| 公交车后车座的疯狂的做| 国产熟妇一区二区三区AⅤ在线| 狠狠色狠狠色综合| 麻豆影视视频高清在线观看| 欧洲女人牲交视频免费| 铜铜铜铜铜铜铜铜好大好深色 | 噜噜狠狠色综合久色AⅤ网址| 欧美金发尤物大战黑人| 丝袜灬啊灬快灬高潮了视频| 亚洲VA综合VA国产产VA中| 综合无码精品人妻一区二区三区 | 天天爽狠狠噜天天噜日日噜| 日本JAPANESE醉酒人妻| 婷婷五月花丁香综合| 亚洲欧美成人综合久久久| 亚洲精品人妻无码| 2021自拍偷在线精品自拍偷 | 中国A级毛片免费| 成熟丰满的人妻中文字幕电影| 国产三级在线观看播放视频| 麻豆精品久久久久久中文字幕无码 | 女警察受呻吟双腿大开H| 深灬深灬深灬深灬一点| 亚洲人成自拍网站在线观看| FREE MOVIES 日本护| 99精品视频一区在线观看| 国产99久久久久久免费看| 丰满少妇邻居找我泻火| 狠狠躁日日躁夜夜躁2020| 欧美精品久久天天躁| 无码精品人妻一区二区三区AV| 呦交小U女精品视频| 公交车上拨开丁字裤进入| 久久99精品久久久久久不卡| 青青青国产手线观看视频2019| 亚洲AV日韩综合一区二区三区| 亚洲成AV人片无码天堂下载| 亚洲国产成人久久精品软件| JAVA强行VIDEOS另类| 国产亚洲日韩AV在线播放不卡| 内射骚妇高清AV电影| 强行挺进美艳老师的后臀| 性色AV一区二区三区无码| 最新在线精品国产福利| 国产精品无码久久AV| 女人和拘做受A级毛片| 性欧美VIDEOFREE高清潮| 亚洲国产成人久久一区久久| 把八重神子焯出白水怎么办| 精品人妻潮喷久久久又裸又黄| 人妻有码中文字幕在线| 亚洲色丰满少妇高潮18P| 丰满年经的继拇6| 乱VODAFONEWIFI熟妇| 无码日韩人妻AV一区二区三区| 97人妻无码一区二区精品免费| 国内精品卡一卡二卡三| 日本高清乱理伦片中文字幕| 我调教同学的放荡麻麻| 2023国精产品一二二线精华液| 国产又爽又粗又猛的视频| 人妻免费一区二区三区最新| 野花影视视频在线观看免费| 国产精品美女久久久浪潮AV | 无码人妻AⅤ一区二区三区用会员| 99精产国品一二三产区区别电影| 激情射精爆插热吻无码视频| 深田えいみ禁欲后被隔壁人妻| 8888国产精华最好的产品| 精品国产一区二区三区久久| 天堂在/线资源中文在线BT| A级国产乱理伦片在线播放| 俄罗斯人又更又租| 女儿男朋友是妈妈的爱豆的电视剧 | 亚洲AV无码乱码在线观看富二代| 成人免费视频无码专区| 免费A级毛片AV无码| 日本少妇毛茸茸高潮| 中英文字幕乱码英文正常| 精品日产A一卡2卡三卡4卡乱| 欧美激情国产精品视频一区二区| 亚洲男人第一AV网站| 国产精品自产拍在线18禁| 日本无人区码一二三区别| 6080午夜三级中文在线观看| 久久久久精品日韩久久久| 亚洲AV色噜噜男人的天堂| 国产成人AV区一区二区三| 人妻人妇人妻一区二区三区| 97精品一区二区视频在线观看 | 亚洲综合无码久久精品综合 | 男女交性视频无遮挡全过程| 亚洲一线产区二线产区区别| 好硬好大好爽18禁免费看男男| 他的粗大把她捣出白沫| 亚洲熟妇无码一区二区三区| 国产精品国产三级国产AN| 上司侵犯部下的人妻| 波多野结衣高潮AV在线播放| 欧美VIDEOS另类极品| 亚洲AV无码成人精品区浪潮AV| 国产成人婷婷丁香在线| 色欲AV国产精品一区二区| 超薄肉色丝袜一二三四区| 欧美日韩国产免费一区二区三区| 18日韩xxxx| 蜜臀精品无码AV在线播放| 伊人依成久久人综合网| 久久久久久AV无码免费网站| 亚洲人女屁股眼HD| 久久99精品久久久久久久不卡| 亚洲精品卡2卡三卡4卡2卡乱码| 狠狠色噜噜狠狠狠狠7777| 亚洲第一无码AV播放器下载| 韩国精品福利一区二区三区| 人妻无码久久精品人妻| MD豆传媒一二三区进站口在线看 | 玩乡下黄花小处雏女| 公愆憩止痒玉米地使用方法| 双腿吊起揉捏花蒂| 国产成人精品一区二区三区免费 | 亚洲加勒比无码一区二区| 极品AV麻豆国产在线观看| 亚洲精品国产精品乱码不卡√| 九九国产精品无码免费视频| 亚洲午夜理论无码电影| 久久天天躁狠狠躁夜夜不卡| 真人无码作爱免费视频禁HNN| 蜜臀AⅤ免费网站| 50妺妺窝人体色聚窝窝www| 欧美成人WWW免费全部网站| А√天堂资源地址在线下载| 日韩人妻中文字幕2021视频| 国产成人免费ā片在线观看老同学 | 鲁鲁网亚洲站内射污| 777成了乱人视频| 人妻体内射精一区二区| 多毛freeoprn熟妇多毛y| 翁熄小莹女博士高潮连连| 国产亚洲精久久久久久无码777| 亚洲娇小与黑人巨大交| 久久亚洲AV无码AV男人的天堂| 69国产成人精品午夜福中文| 日本适合十八岁以上的护肤品| 国产成人无码AV一区二区| 亚洲AV无码1区2区久久| 久久久精品无码中文天美| 50多岁岳不让我戴套| 日韩精品专区AV无码| 国产剧情MV天美传媒| 亚洲性夜夜综合久久7777| 女儿的朋友6中汉字| 从厨房一路干到卧室好吗| 午夜熟女插插XX免费视频| 精品少妇一区二区| 99麻豆久久久国产精品免费 | 漂亮人妻被中出中文字幕久久| 夫上司人妻秘书OL中文有码| 亚洲AV成人午夜福利在线观看| 俄罗斯美女做爰XXXⅩ啪啪| 西西人体大胆WWW444| 久久久久久久精品免费看| BGMBGMBGM老太太水太多| 天堂AⅤ无码一区二区三区| 黑人与亚洲女人XXXXXXXⅩ| 中文日产无乱码AV在线观 | 野花香日本大全免费观看 | 被喂春药蹂躏的欲仙欲死视频| 无码人妻黑人中文字幕| 久久久久久国产精品无码下载 | 亚洲中文字幕无码永久在线| 欧美色成人综合天天影院| 国产成人一区二区三区影院 | 反差婊吃瓜黑料热门网曝| 亚洲丁香婷婷久久一区二区| 男j插女p无遮挡100%| 嗯~别停~用力点~再快点| 亚洲男同GV在线观看| 人妻无码中文字幕永久有效视频| 国产女人18毛片水真多| 中文字幕人成乱码熟女免费| 首页 动漫 亚洲 欧美 日韩| 久久国内精品一区二区三区| 菠萝蜜国际通道一区麻豆| 亚洲成av人无码| 青青草视频 成人|