j箭头函数使用注意点

  <script>
/*(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。

  (3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。

(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。*/

function foo() { setTimeout(() => { console.log('id:', this.id); }, 100); } var id = 21; foo.call({ id: 42 }); // id: 42

    //上面代码中,setTimeout的参数是一个箭头函数,这个箭头函数的
   定义生效是在foo函数生成时,
    //而它的真正执行要等到 100 毫秒后。如果是普通函数,执行时this
    应该指向全局对象window,这时应该输出21。
    //但是,箭头函数导致this总是指向函数定义生效时所在的对象(本例
     是{id: 42}),所以输出的是42。*/



   /*箭头函数可以让setTimeout里面的this,绑定定义时所在的作用域,
   // 而不是指向运行时所在的作用域。下面是另一个例子。

function Timer() { this.s1 = 0; this.s2 = 0; // 箭头函数 setInterval(() => this.s1++, 1000); // 普通函数 setInterval(function () { this.s2++; }, 1000); } var timer = new Timer(); setTimeout(() => console.log('s1: ', timer.s1), 3100); setTimeout(() => console.log('s2: ', timer.s2), 3100); // s1: 3 // s2: 0 */

 //箭头函数可以让this指向固定化,这种特性很有利于封装回调函数。
 // 下面是一个例子,DOM 事件的回调函数封装在一个对象里面。

var handler = { id: '123456', init: function() { document.addEventListener('click', event => this.doSomething(event.type), false); }, doSomething: function(type) { console.log('Handling ' + type + ' for ' + this.id); } };

  //上面代码的init方法中,使用了箭头函数,这导致这个箭头函数里面 
  的  this,总是指向handler对象。
 // 否则,回调函数运行时,this.doSomething这一行会报错,因为此时  
 this指向document对象。

//this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,
// 导致内部的this就是外层代码块的this。正是因为它没有this,所以也就不能用作构造函数。
//如下:
function foo() { return () => { return () => { return () => { console.log('id:', this.id); }; }; }; } var f = foo.call({id: 1}); var t1 = f.call({id: 2})()(); // id: 1 var t2 = f().call({id: 3})(); // id: 1 var t3 = f()().call({id: 4}); // id: 1

上面代码之中,只有一个this,就是函数foo的this,所以t1、t2、t3都输出同样的结果。
因为所有的内层函数都是箭头函数,都没有自己的this,它们的this其实都是最外层foo函数的this。*/

</script>

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容