JS 中 this 指向,call()、apply()、bind()

1.方法中的 this

在对象方法中, this 指向调用它所在方法的对象。

在上面一个实例中,this 表示 person 对象。

fullName 方法所属的对象就是 person。

fullName : function() {
  return this.firstName + " " + this.lastName;
}

2.函数中使用 this(默认)

在函数中,函数的所属者默认绑定到 this 上。

在浏览器中,window 就是该全局对象为 [object Window]:

function myFunction() {
  return this;
}

3.函数中使用 this(严格模式)

严格模式下函数是没有绑定到 this 上,这时候 this 是 undefined

"use strict";
function myFunction() {
  return this;
}

4.事件中的 this

在 HTML 事件句柄中,this 指向了接收事件的 HTML 元素:

<button onclick="this.style.display='none'">
点我后我就消失了
</button>

5. 箭头函数

箭头函数 this 不会被改变,所以只要当前函数是箭头函数,那么就不用再看其他规则了。

箭头函数的 this 是在创建它时外层 this 的指向。这里的重点有两个:

  1. 创建箭头函数时,就已经确定了它的 this 指向。
  2. 箭头函数内的 this 指向外层的 this

箭头函数是不绑定this的,它的this来源于上级作用域

var user = {
  name: 'kiki',
  foo: () => {
    console.log('箭头函数中的this',this)
  }
}
user.foo()

以上代码的执行结果如下

这里调用foo函数,因为箭头函数不绑定this,所以去foo函数的上级查找this,找到了全局对象window

6.new

function Person(name, age) {
  this.name = name
  this.age = age
}
const p1 = new Person('alice', 20)
const p2 = new Person('mogan', 24)
console.log(p1)
console.log(p2)

上代码的执行结果如下

此时this指向的是通过new创建的实例对象

7.改变this指向

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

7.1.apply方法

apply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传入,且当第一个参数为null、undefined的时候,默认指向window(在浏览器中),使用apply方法改变this指向后原函数会立即执行,且此方法只是临时改变thi指向一次。

日常用法:改变this指向

示例:

回调函数绑定this指向:

var name="martin";
var obj={
 name:"lucy",
 say:function(year,place){
 console.log(this.name+" is "+year+" born from "+place);
 }
};
var say=obj.say;
setTimeout(function(){
 say.apply(obj,["1996","China"])
} ,0); //lucy is 1996 born from China,this改变指向了obj
say("1996","China") //martin is 1996 born from China,this指向window,说明apply只是临时改变一次this指向

示例:

求数组中的最大值:

var arr=[1,10,5,8,3];
console.log(Math.max.apply(null, arr)); //10

其中Math.max函数的参数是以参数列表,如:Math.max(1,10,5,8,3)的形式传入的,因此我们没法直接把数组当做参数,但是apply方法可以将数组参数转换成列表参数传入,从而直接求数组的最大值。

7.2.call方法

call方法的第一个参数也是this的指向,后面传入的是一个参数列表(注意和apply传参的区别)。当一个参数为null或undefined的时候,表示指向window(在浏览器中),和apply一样,call也只是临时改变一次this指向,并立即执行。

var arr=[1,10,5,8,3];
console.log(Math.max.call(null,arr[0],arr[1],arr[2],arr[3],arr[4])); //10

​​​​​​​采纳以参数列表的形式传入,而apply以参数数组的形式传入。

7.3.bind方法

bind方法和call很相似,第一参数也是this的指向,后面传入的也是一个参数列表(但是这个参数列表可以分多次传入,call则必须一次性传入所有参数),但是它改变this指向后不会立即执行,而是返回一个永久改变this指向的函数。

var arr=[1,10,5,8,12];
var max=Math.max.bind(null,arr[0],arr[1],arr[2],arr[3])
console.log(max(arr[4])); //12,分两次传参

可以看出,bind方法可以分多次传参,最后函数运行时会把所有参数连接起来一起放入函数运行。

7.4.apply,call,bind三者的区别

  • 三者都可以改变函数的this对象指向。
  • 三者第一个参数都是this要指向的对象,如果如果没有这个参数或参数为undefined或null,则默认指向全局window。
  • 三者都可以传参,但是apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入。
  • bind 是返回绑定this之后的函数,便于稍后调用;apply 、call 则是立即执行 。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: call、applybind都是JavaScript的函数方法,它们都可以用来改变函数的this指向。 1. call方法:可以改变函数的this指向,并立即执行该函数。它的第一个参数是要绑定给this的对象,后面的参数是传递给函数的参数列表。 2. apply方法:与call方法类似,也可以改变函数的this指向,但是它的第二个参数是一个数组,其包含了传递给函数的参数列表。 3. bind方法:可以创建一个新的函数,并将原函数的this指向绑定到指定的对象上。它的第一个参数是要绑定给this的对象,后面的参数是传递给函数的参数列表。与call和apply不同的是,bind方法不会立即执行函数,而是返回一个新的函数,需要手动调用才能执行。 总之,这三个方法都可以用来改变函数的this指向,但是它们的使用场景略有不同。需要根据具体情况来选择使用哪个方法。 ### 回答2: 在JavaScript,call、applybind都是用来改变函数执行的上下文的方法。这些方法都是函数的原型方法,可以在任何函数上使用。这些方法的作用是允许你指定函数的“this”关键字应指向哪个对象。 call和apply的作用是在指定的上下文调用函数,并且可以传递一个或多个参数。传递给call和apply的第一个参数都是要指定的上下文对象。接下来的参数都会被传递给函数。 call方法和apply方法很像,区别就是call方法接受一系列参数,而apply方法则接受一个数组作为它的第二个参数。 bind方法可以创建一个新的函数,新函数与原来的函数功能相同,只是它的执行上下文和参数已被预设。当你调用bind函数时,它会返回一个新的函数,这个函数的上下文和参数都会在调用bind时被设置。 综上所述,call,applybind都是用来改变函数执行的上下文的方法,它们都用于解决函数“this”关键字的指向问题。call和apply比较适合使用在需要动态传递参数的情况下,而bind方法则比较适合在需要预设参数的情况下。理解了这些方法的用途和作用,便可以更加灵活地运用它们来编写更加优秀的代码。 ### 回答3: JavaScript的call、applybind是函数的三种不同调用方式。 1. call方法 call() 方法可以用来调用一个函数,并设置该函数内部的this关键字为传递给call() 方法的第一个参数。如果函数的第一个参数是null或undefined那么this关键字指向全局对象window。 除了第一个参数,它可以带任意多个参数,这些参数将按顺序传递给被调用的函数。在ES6之前call方法是改变this上下文的第一种选择。 示例: function add(a, b) { return a + b; } const result = add.call(null, 2, 3); // 传递 null 到 a ,参数 [2, 3] 将传递给 b console.log(result); // 5 2. apply方法 apply() 方法与 call() 方法的作用类似,它可以用来调用一个函数,并设置该函数内部的this关键字为传递给apply()方法的第一个参数,不同的是apply方法第二个参数是一个数组或类数组对象。 参数传递的方式同样是按顺序传递给被调用的函数。 示例: function add(a, b) { return a + b; } const arr = [2, 3]; const result = add.apply(null, arr); // 传递 null 到 a ,参数 [2, 3] 将传递给 b console.log(result); // 5 3. bind方法 bind() 方法也是用来改变函数内部的this关键字的,但是与call() 和 apply() 不同的是,它不会立即调用被调用的函数,而是返回一个新的函数,新函数的this被指定为bind()方法的第一个参数。bind方法返回的函数可以传递参数,在被调用原函数时,这些参数会跟在传递给bind的参数后面传递。 示例: var person = { firstName: 'John', lastName: 'Doe', getFullName: function() { return this.firstName + ' ' + this.lastName; } } var getUserData = function(message, callback) { console.log(message + ": " + callback()); }; var boundFunct = person.getFullName.bind(person); getUserData('User name', boundFunct); // User name: John Doe 在开发,可以根据具体的使用场景选择使用哪种方法。当需要立即调用函数并附加一些参数时,使用call() 或 apply()。当想先创建一个对象并在之后的某个时间点调用该函数时,使用bind()。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值