掌握JavaScript中的call、apply和bind方法

callapply都是立即执行函数,并且可以指定函数的this指向和参数,不同之处在于参数的传递方式(call是逐个传递,apply是以数组形式传递)。
bind则是返回一个新函数,可以在以后任何时间执行,同时也可以指定函数的this指向和参数。

  1. call()call方法可以改变函数的this指向,并且立即执行该函数。它的第一个参数是this要指向的对象,之后的参数是传递给函数的参数,参数列表是逐个传递的。例如:

    function greet(message) {
      console.log(message + ', ' + this.name);
    }
    
    var person = {name: 'Tom'};
    greet.call(person, 'Hello'); // 输出: Hello, Tom
    
  2. apply()apply方法的作用和call方法类似,也是改变函数的this指向并立即执行函数。不同之处在于apply的参数是以数组的形式传递的。例如:

    function greet(message) {
      console.log(message + ', ' + this.name);
    }
    
    var person = {name: 'Tom'};
    greet.apply(person, ['Hello']); // 输出: Hello, Tom
    
  3. bind()bind方法不会立即执行函数,而是返回一个改变了this指向的新函数,可以在之后任何时间执行。bind的参数和call的参数类似,是逐个传递的。例如:

    function greet(message) {
      console.log(message + ', ' + this.name);
    }
    
    var person = {name: 'Tom'};
    var sayHello = greet.bind(person, 'Hello');
    sayHello(); // 输出: Hello, Tom
    

bind方法和定时器setTimeout的例子

var person = {
  name: 'Tom',
  sayName: function() {
    console.log(this.name);
  }
};

// 使用bind方法改变setTimeout中回调函数的this指向
setTimeout(person.sayName.bind(person), 1000);

下面是一个结合bind方法和定时器setTimeout的例子:

var person = {
  name: 'Tom',
  sayName: function() {
    console.log(this.name);
  }
};

// 使用bind方法改变setTimeout中回调函数的this指向
setTimeout(person.sayName.bind(person), 1000);

person对象有一个sayName方法,用来打印对象的name属性。
如果直接将person.sayName作为setTimeout的回调函数,那么在回调函数执行时,this将指向全局对象(在浏览器中是window),因此this.name将不会是我们预期的'Tom'
在这里插入图片描述
为了解决这个问题,使用bind方法创建了一个新的函数,这个新函数的this被绑定到person对象上。
然后,将这个新函数作为setTimeout的回调函数。
这样,当定时器到时执行回调函数时,this将正确地指向person对象,因此this.name将输出'Tom'
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值