久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      es6中箭頭函數(shù)和普通函數(shù)的區(qū)別是什么

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

      es6中箭頭函數(shù)和普通函數(shù)的區(qū)別是什么

      本教程操作環(huán)境:windows7系統(tǒng)、ECMAScript 6版、Dell G3電腦。

      箭頭函數(shù)是前端面試環(huán)節(jié)的一個(gè)高頻考點(diǎn),箭頭函數(shù)是ES6的API,相信很多人都知道,因?yàn)樗恼Z法比一般的函數(shù)更簡潔,所以深受大家的喜愛。

      一、基本語法

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

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

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

      關(guān)于箭頭函數(shù)的參數(shù):

      如果箭頭函數(shù)沒有參數(shù),直接寫一個(gè)空括號即可。

      如果箭頭函數(shù)的參數(shù)只有一個(gè),也可以省去包裹參數(shù)的括號。

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

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

      關(guān)于箭頭函數(shù)的函數(shù)體:

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

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

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

      // 用小括號包裹要返回的對象,不報(bào)錯(cuò) let getTempItem = id => ({ id: id, name: "Temp" });  // 但絕不能這樣寫,會報(bào)錯(cuò)。 // 因?yàn)閷ο蟮拇罄ㄌ枙唤忉尀楹瘮?shù)體的大括號 let getTempItem = id => { id: id, name: "Temp" };

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

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

      箭頭函數(shù)最常見的用處就是簡化回調(diào)函數(shù)。

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

      二、箭頭函數(shù)與普通函數(shù)的區(qū)別

      1、語法更加簡潔、清晰

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

      2、箭頭函數(shù)不會創(chuàng)建自己的this(重要??!深入理解!?。?/strong>

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

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

      箭頭函數(shù)沒有自己的this,它會捕獲自己在定義時(shí)(注意,是定義時(shí),不是調(diào)用時(shí))所處的外層執(zhí)行環(huán)境的this,并繼承這個(gè)this值。所以,箭頭函數(shù)中this的指向在它被定義的時(shí)候就已經(jīng)確定了,之后永遠(yuǎn)不會改變。

      來看個(gè)例子:

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

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

      再來看另一個(gè)例子:

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

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

      3、箭頭函數(shù)繼承而來的this指向永遠(yuǎn)不變(重要?。∩钊肜斫猓。。?/strong>

      上面的例子,就完全可以說明箭頭函數(shù)繼承而來的this指向永遠(yuǎn)不變。對象obj的方法b是使用箭頭函數(shù)定義的,這個(gè)函數(shù)中的this永遠(yuǎn)指向它定義時(shí)所處的全局執(zhí)行環(huán)境中的this,即便這個(gè)函數(shù)是作為對象obj的方法調(diào)用,this依舊指向Window對象。

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

      .call()/.apply()/.bind()方法可以用來動態(tài)修改函數(shù)執(zhí)行時(shí)this的指向,但由于箭頭函數(shù)的this定義時(shí)就已經(jīng)確定且永遠(yuǎn)不會改變。所以使用這些方法永遠(yuǎn)也改變不了箭頭函數(shù)this的指向,雖然這么做代碼不會報(bào)錯(cuò)。

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

      5、箭頭函數(shù)不能作為構(gòu)造函數(shù)使用

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

      但是!!因?yàn)榧^函數(shù)沒有自己的this,它的this其實(shí)是繼承了外層執(zhí)行環(huán)境中的this,且this指向永遠(yuǎn)不會隨在哪里調(diào)用、被誰調(diào)用而改變,所以箭頭函數(shù)不能作為構(gòu)造函數(shù)使用,或者說構(gòu)造函數(shù)不能定義成箭頭函數(shù),否則用new調(diào)用時(shí)會報(bào)錯(cuò)!

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

      6、箭頭函數(shù)沒有自己的arguments

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

      // 例子一 let fun = (val) => {     console.log(val);   // 111     // 下面一行會報(bào)錯(cuò)     // Uncaught ReferenceError: arguments is not defined     // 因?yàn)橥鈱尤汁h(huán)境沒有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);

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

      es6中箭頭函數(shù)和普通函數(shù)的區(qū)別是什么

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

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

      7、箭頭函數(shù)沒有原型prototype

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

      8、箭頭函數(shù)不能用作Generator函數(shù),不能使用yeild關(guān)鍵字

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號