<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>