# 普通函数和箭头函数的区别
普通函數(shù)和箭頭函數(shù)
寫在前面
函數(shù)(Function)是 JavaScript 里的‘一等公民’。是由稱為函數(shù)體的一系列語句組成。可以當做入?yún)?#xff0c;出參(返回值)使用。和對象一樣,有自己的屬性和方法。區(qū)別之處在于可以被調(diào)用。數(shù)據(jù)類型是 function(用 typeof 判斷),用 Object.prototype.toString.call() 判斷是 [object Function]。如果沒有使用 retrun 語句,則默認返回 undefined。反之則函數(shù)必須使用 return 語句來指定一個要返回的值。(使用 new 關(guān)鍵字調(diào)用一個構(gòu)造函數(shù)除外,不再是實例化一個對象)。函數(shù)執(zhí)行時,this 關(guān)鍵字并不會指向正在運行的函數(shù)本身,而是指向調(diào)用該函數(shù)的對象。 函數(shù)表達式不會提升,因此在使用之前必須先聲明。和用 var 聲明變量不一樣。
產(chǎn)生原因
箭頭函數(shù)的產(chǎn)生原因就是在于 this 關(guān)鍵字指向問題。它很容易讓人產(chǎn)生疑惑,尤其是當函數(shù)調(diào)用層級比較多的時候。和傳統(tǒng)函數(shù)定義相比,語法也相對簡潔。并且沒有自己的this,arguments,super或 new.target。這些函數(shù)表達式更適用于那些本來需要匿名函數(shù)的地方,并且它們不能用作構(gòu)造函數(shù)。箭頭函數(shù) this 指向的固定化,并不是因為函數(shù)內(nèi)部做了處理,而是因為箭頭函數(shù)在創(chuàng)建的時候根本就沒有自己的 this。
使用箭頭函數(shù)需要注意的點
1,函數(shù)體內(nèi)的 this 對象,是定義時所在對象,而不是調(diào)用該函數(shù)的對象。 2,正因為自己本身沒有 this 對象,因此不可以用作構(gòu)造函數(shù),不能用 call(),apply(),bind()這些方法去改變 this 的指向。 3,不綁定 arguments 對象,可以使用 rest 參數(shù)來解決。 4,嚴格模式(use strict)中,指定的與 this 相關(guān)的規(guī)則都將被忽略。
var aaa = () => {'use strict';console.log(this);// window }var bbb = function() {'use strict';console.log(this);// undefined } 復(fù)制代碼5,不能使用 new 操作符,否則會報錯
var Func = () => {}; var func = new Func(); // TypeError: Func is not a constructor 復(fù)制代碼6,沒有 prototype 屬性
var Func = () => {}; console.log(Func.prototype); // undefined 復(fù)制代碼7,不能用作生成器。 yield 關(guān)鍵字通常不能在箭頭函數(shù)中使用(除非是嵌套在允許使用的函數(shù)內(nèi))。 8,箭頭函數(shù)的簡寫,可以直接省略 return,在塊體中,必須使用明確的 return 語句。如果需要返回對象字面量的話,記得用圓括號包起來。
var func = () => ({num: 1}); 復(fù)制代碼寫在后面
拋一個大佬留下的問題,有箭頭函數(shù)的 IIEF:
(() => { console.log('執(zhí)行看看'); // 執(zhí)行看看 })(); 復(fù)制代碼這個是可以的,但是下面的寫法就會報錯
(() => { console.log('執(zhí)行看看'); // Uncaught SyntaxError: Unexpected token ( }());復(fù)制代碼有知道原因的小伙伴嗎?
轉(zhuǎn)載于:https://juejin.im/post/5b3c9872f265da0fa21a5e32
總結(jié)
以上是生活随笔為你收集整理的# 普通函数和箭头函数的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正则 8-18位长度,数字,字母,字符
- 下一篇: 解决Exchange2010中无法显示客