js中的this指向:
在构造函数中指向构造的实例
//构造函数
function Fn(){
console.log(this); //Fn()
}
new Fn()
在普通函数中谁调用就指向谁,没有调用的情况指向window
//普通函数
function fn(){
console.log(this); //window
}
fn()
箭头函数;
1.箭头函数的出现是为了解决ES5中this指向混乱问题
2.箭头函数没有自己的this指向,它的this来自父级上下文,并且永远指父级上下文
3.箭头函数的this不会在调用时候被改变,因为箭头函数在声明的时候它的this就已经被永久确定了。
箭头函数与普通函数的区别:
1.箭头函数是匿名函数,不能作为构造函数,也不能使用new,否则就会报错
let Obj=()=>{
this.name=name;
this.age=18;
}
let obj=new Obj();//报错:Obj is not a constructor
2.箭头函数的this始终指向父级上下文
//箭头函数
let obj={
a:100,
fn:function(){
console.log(this);//obj
},
fn2:()=>{
console.log(this); //window
}
}
obj.fn();
obj.fn2();
3.箭头函数没有原型属性
4.箭头函数内没有arguments,可以用展开运算符..解决(arguments=>参数集合=>伪 数组)
函数.caller()谁调用当前的方法,会返回这个方法本身
arguments.callee==>当前这个方法本身
arguments参数集合 是一个类数组 不能调用数组的方法
let fn=()=>{
console.log(arguments);//arguments is not defined
}
fn(1,2,3)
let fn1=(...args)=>{//使用展开运算符接收参数集合
console.log(args);//[4,5,6]
}
fn1(4,5,6)
5.箭头函数不能使用call,apply,bind修改this指向,但是可以正常传递参数
let obj={
name:'张三',
birth:1999,
age:(arg1,arg2)=>{
console.log(this);//windpw
console.log(arg1,arg2);//哈哈 嘿嘿
}
}
let obj2={
name:'王五',
birth:2002,
}
obj.age.call(obj2,'哈哈','嘿嘿')