箭头函数和普通函数的区别如下:
普通函数:谁调用我,我的this就指向谁。
箭头函数:我定义在哪个位置,this就指向谁。
总结:
普通函数中的this:
1.this总是代表它的直接调用者, 例如 obj.func ,那么func中的this就是obj
2.在默认情况,没找到直接调用者,则this指的是 window,常见的window的属性和方法有: alert, location,document,parseInt,setTimeout,setInterval等。
3.使用call,apply,bind(ES5新增)绑定的,this指的是绑定的对象。
4.全局作用域下,用var和function声明定义并调用的变量this都指向window。
示例:
let a = 'zs';
let aa = setTimeout(function () {
console.log(this)//window
console.log(this.a)//undefined
}, 1000);
分析:回调函数的this都指向window,let声明的变量不指向window
1.第一组比较:
普通函数:
var age = 100;
var obj = {
age: 20,
say: function () {
console.log(this.age)//20
}
}
obj.say()
结果显示:20
分析:普通函数,谁调用函数,函数的this就指向谁,这里obj调用say(),所以this指向obj,那obj.age=20,所以打印结果为20。
箭头函数:
var age = 100;
var obj = {
age: 20,
say: () => {
console.log(this.age)//指向window
}
}
obj.say()
结果显示:100
分析:箭头函数,函数的this指向该函数被定义时的位置,function定义时this指向window,第一行用var声明且赋值的变量也指向window,那window.age=100,所以打印结果为100。
2.第二组比较:
普通函数+call:
const obj = { name: '张三' }
function fn() {
console.log(this);//{ name: '张三' }
return function () {
console.log(this);//window,普通函数this指向调用的位置
}
}
const resFn = fn.call(obj);
resFn();
结果显示:两次打印的this都指向window
这个对象。
分析:这次的第8行,fn函数的this指向由window
变为了obj
,所以第3行输出了{ name: '张三' }
,函数继续执行,我们看到常量resFn承接了fn函数返回的一个函数声明
,第9行调用了这个函数,这是一个普通函数
,那它的this指向的是它调用的位置,此时resFn在全局作用域下被调用,那么这个函数的this应该指向window
。
箭头函数:
const obj = { name: '张三' }
function fn() {
console.log(this);//window
return () => {
console.log(this);//window
}
}
const resFn = fn();
resFn();
结果显示:第一次打印的this都指向obj
这个对象,第二次this指向window
。
分析:这次的第8行,fn函数没有执行call()函数,那由于fn是在全局作用域下定义的函数,此时的function,this指向window
,所以第2行,输出为window。第9行调用了这个函数,由于该函数是箭头函数
,它的this指向的是函数定义时
的那个this的指向,这个函数定义在fn里面,fn的this指向window
,所以这个箭头函数也指向window
箭头函数+call():
const obj = { name: '张三' }
function fn() {
console.log(this);//{ name: '张三' }
return () => {
console.log(this);//{ name: '张三' }
}
}
const resFn = fn.call(obj);//改变了fn的this指向,指向obj这个对象
resFn();
结果显示:两次打印的this都指向obj
这个对象,输出结果都是{ name: '张三' }
。
分析:第8行表明,fn函数的this指向由window
变为了obj
,所以第3行输出了{ name: '张三' }
,函数继续执行,我们看到常量resFn承接了fn函数返回的一个函数声明
,第9行调用了这个函数,由于该函数是箭头函数
,它的this指向的是函数定义时
的那个this的指向,这个函数定义在fn里面,fn的this指向obj
,所以这个箭头函数也指向obj