this的理解和call/apply/bind方法

引言:this的理解

this的意思为“这个;当前”,是一个指针型变量,它动态指向当前函数的运行环境。在不同的场景中调用同一个函数,this的指向也可能会发生变化,但是它永远指向其所在函数的真实调用者;如果没有调用者,就指向全局对象window。

call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象

1.JavaScript call() 方法

call() 方法是预定义的 JavaScript 方法。call() 方法可接受参数,也可以不带参数。第一个为函数上下文也就是this,后边参数为函数本身的参数。

(1)当不带参数时候

就是简单的使用属于另一个对象的方法。例如:

var person = {
    fullName: function() {       
       return this.firstName + " " + this.lastName;
    }
}
var person1 = {
    firstName:"Bill",
    lastName: "Gates",
}
person.fullName.call(person1);  // 将返回 "Bill Gates"

其中,fullName 属性是一个方法。person 对象是该方法的拥有者。fullName 属性属于 person 对象的方法。

本例调用 person 的 fullName 方法,并用于 person1。

(2)带参数的call

使用方式: A.call( B,x,y )------就是把A的函数放到B中运行,x 和 y 是A方法的参数。例如:

var person = {
  fullName: function(city, country) {    return this.firstName + " " + this.lastName + "," + city + "," + country;
  }
}
var person1 = { firstName:"Bill", lastName: "Gates"} person.fullName.call(person1, "Seattle", "USA"); // 此例调用 person 的 fullName 方法,在 person1 上使用它,输出为:Bill Gates,Seatle,USA

拓展:call方法可以实现继承

 

 2.JavaScript apply() 方法

apply() 方法与 call() 方法非常相似:

不同之处是:

call() 方法分别接受参数

apply() 方法接受数组形式的参数。

因此,如果要使用数组而不是参数列表,则 apply() 方法非常方便。

上例中将call换成apply的结果是一样的。当有数组传递时候,如:

var person = {
  fullName: function(city, country) {    return this.firstName + " " + this.lastName + "," + city + "," + country;
  }
}
var person1 = {
  firstName:"Bill",
  lastName: "Gates"}
person.fullName.apply(person1, ["Oslo", "Norway"]);
// 在此示例中,person 的 fulllName 方法在 person1 上应用,输出结果为:Bill Gates,Seatle,USAke

3.bind()

bind()方法主要就是将函数绑定到某个对象,bind()会创建一个函数,函数体内的this对象的值会被绑定到传入bind()第一个参数的值,例如,f.bind(obj),实际上可以理解为obj.f(),这时,f函数体内的this自然指向的是obj。

Function.prototype.bind()

bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

当传入参数的时候,语法是:“function.bind(thisArg[, arg1[, arg2[, ...]]])”,其中参数thisArg表示调用绑定函数时作为this参数传递给目标函数的值。

bind 接收多个参数,第一个是bind返回值返回值是一个函数上下文的this,不会立即执行。

obj.myFun.call(db,'成都','上海');     // 德玛 年龄 99  来自 成都去往上海
obj.myFun.apply(db,['成都','上海']);      // 德玛 年龄 99  来自 成都去往上海  
obj.myFun.bind(db,'成都','上海')();       // 德玛 年龄 99  来自 成都去往上海
obj.myFun.bind(db,['成都','上海'])();   // 德玛 年龄 99  来自 成都, 上海去往 undefined

  以上出了 bind 方法后面多了个 () 外 ,结果返回都一致!由此得出结论,bind 返回的是一个新的函数,你必须调用它才会被执行。

综上:

call()、apply()、bind() 都是用来重定义 this 这个对象的!

call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,'成都', ... ,'string' )

apply 的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,[x,x,x ])

bind 除了返回是函数以外,它 的参数和 call 一样。

bind返回对应方法,不会立即执行,调用返回的方法才会执行。apply和call则是立即调用。这也是它们的主要区别。 

2.JavaScript apply() 方法

apply() 方法与 call() 方法非常相似:

不同之处是:

call() 方法分别接受参数

apply() 方法接受数组形式的参数。

因此,如果要使用数组而不是参数列表,则 apply() 方法非常方便。

上例中将call换成apply的结果是一样的。当有数组传递时候,如:

posted @ 2023-02-10 11:14  122www  阅读(42)  评论(0编辑  收藏  举报