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实参是在其传入参数的基础上往后获取参数执行。

 

posted @ 2022-06-10 21:08  诉诉飞飞  阅读(53)  评论(0编辑  收藏  举报