this
1.在对象方法中,作为对象的一个方法被调用时,this指向调用它所在的方法的对象
var obj={ x:111, y:222, add:function(){ console.log(this.x+this.y) } } obj.add() //333
2.在构造函数中的this
通过new操作符来创建构造函数的实例对象,这个构造函数的this就指向这个新的实例对象。同时构造函数的prototype属性下面方法中的this也指向合格新的实力对象
var arr1=[1,2,3]; var arr2=new Array(4,5,6); console.log(arr1) //(3) [1, 2, 3] console.log(arr2)(3) [4, 5, 6]
function Abc(){
this.num=100; }
Abc.prototype.getNum=function(){
return this.num
} var a1=new Abc();
a1.num=200; //存在这句话为200 不存在为100
console.log(a1.getNum()) //200
特例:
var obj={ add:function(){ function fn1(){ console.log(this) } fn1() } } obj.add() //Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
3.call apply bind 显示修改this指向
var obj1={ name:'111', num:222, add:function(text,number){ console.log(this.name+this.num+text+number) } } var obj2={ name:'333', num:444 } //apply:第二个参数是数组或者arguments参数集合 //call:第二个参数和之后的参数可以使任意数据类型 obj1.add(); //111222undefinedundefined //this--指向obj1 obj1.add.call(obj2,'555',['666',777]) //333444555666,777 this--指向obj2 obj1.add.call() //undefinedundefinedundefined this--指向windows obj1.add.apply(obj2,[777,888]) //333444777888
//调用bind()方法不会执行test()函数,也不会改变test()函数本身,只会返回一个已经修改了this指向的新函数,这个新函数可以赋值给一个变量,调用这个变量新函数才能只能t1() function test(x,y){ console.log(x,y) } var obj={ abc:123 } var t1=test.bind(obj,200); t1(300,400) //200 300 test(10,200) //10 200 test.call(obj,600) //600 undefined bind和call的区别 1.bind的返回值是函数,并且不会自动调用执行 2.两者后面的参数的使用也不同,call是把第二个及以后的参数作为原函数的实参传进去,而bind实参是在其传入参数的基础上往后获取参数执行。