资讯专栏INFORMATION COLUMN

call、apply和bind方法

clasnake / 2109人阅读

摘要:和和方法非常相似,都是先设置函数中的操作符的值,并且执行这个函数。区别以数组形式接受传递给函数的参数以单个分开参数的形式例子使用操作符访问实例的和属性通过和函数调用该方法方法也可以设置操作符的值,但不执行它。

1. call和apply call和apply方法非常相似,都是先设置函数中的this操作符的值,并且执行这个函数。

区别:

apply以数组形式接受传递给函数的参数

call以单个分开参数的形式

例子:

class Person {
    public name: string;
    public surname: string;
    
    constructor(name: string, surname: string) {
        this.name = name;
        this.surname = surname;
    }
    
    public greet(city: string, country: string) {
        // 使用this操作符访问实例的name和surname属性
        var msg = `Hi, my name is ${this.name} ${this.surname}. `;
        msg += `I"m from ${city} (${country}).`;
        console.log(msg);
    }
}


var person = new Person("Fourteen", "Zhang");

person.greet("Shijiazhuang", "China");
// Hi, my name is Fourteen Zhang. I"m from Shijiazhuang (China).

// 通过call和apply函数调用该方法
person.greet.call(person, "Shijiazhuang", "China");
person.greet.apply(person, ["Shijiazhuang", "China"]);

var valueOfThis = { name: "Fourteen", surname: "Zhang" };
person.greet.call(valueOfThis, "Shijiazhuang", "China");
person.greet.apply(valueOfThis, ["Shijiazhuang", "China"]);
// Hi, my name is Fourteen Zhang. I"m from Shijiazhuang (China).
2. bind bind方法也可以设置this操作符的值,但不执行它。

注意:

调用函数的bind方法时,返回一个和原函数具有相同函数体和作用域的新函数

函数体内部的this操作符指向的值,已被永久地改变为传递给bind方法的第一个参数,不会改变

例子:

var person = new Person("Fourteen1", "Zhang");

var greet = person.greet.bind(person);

greet.call(person, "Hebei", "China");
greet.apply(person, ["Hebei", "China"]);
// Hi, my name is Fourteen1 Zhang. I"m from Shijiazhuang (China).

greet.call(null, "Hebei", "China");
greet.apply(null, ["Hebei", "China"]);
// Hi, my name is Fourteen1 Zhang. I"m from Hebei (China).

var valueOfThis = { name: "Fourteen2", surname: "Zhang" };
greet.call(valueOfThis, "Hebei", "China");
greet.apply(valueOfThis, ["Hebei", "China"]);
// Hi, my name is Fourteen1 Zhang. I"m from Hebei (China).

一旦使用bind方法为一个函数内的this操作符进行了绑定,就不能再覆盖它:

var valueOfThis = { name: "Fourteen3", surname: "Zhang" };

var greet = person.greet.bind(valueOfThis);
greet.call(valueOfThis, "Hebei", "China");
greet.apply(valueOfThis, ["Hebei", "China"]);
// Hi, my name is Fourteen1 Zhang. I"m from Hebei (China).

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90759.html

相关文章

  • JS基础篇--callapplybind方法详解

    摘要:首先我们可以通过给目标函数指定作用域来简单实现方法保存,即调用方法的目标函数考虑到函数柯里化的情况,我们可以构建一个更加健壮的这次的方法可以绑定对象,也支持在绑定的时候传参。原因是,在中,多次是无效的。而则会立即执行函数。 bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。 apply、call 在 javascript 中,call 和 apply 都是...

    lastSeries 评论0 收藏0
  • JS中的callapplybind方法详解

    摘要:不能应用下的等方法。首先我们可以通过给目标函数指定作用域来简单实现方法保存,即调用方法的目标函数考虑到函数柯里化的情况,我们可以构建一个更加健壮的这次的方法可以绑定对象,也支持在绑定的时候传参。原因是,在中,多次是无效的。 bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。 apply、call 在 javascript 中,call 和 apply 都是...

    zombieda 评论0 收藏0
  • 前端基础:call,apply,bind的的理解

    摘要:和区别其实他们的作用是一样的,只是传递的参数不一样而已。接受个参数,第一个参数指定了函数体内对象的指向,第二个参数为数组或者一个类数组。看个栗子一个有意思的事在中,多次是无效的。而则会立即执行函数。 背景 前两天在做小程序的需求的时候用到bind的时候才想起自己对这三的东西的了解比较浅薄,这个时候用的时候就有点怕。时候还是要好好学习下,理解下怎么玩。 正文 先说call 和 apply...

    netmou 评论0 收藏0
  • 理解JavaScript中的call,applybind方法

    摘要:输出的作用与和一样,都是可以改变函数运行时上下文,区别是和在调用函数之后会立即执行,而方法调用并改变函数运行时上下文后,返回一个新的函数,供我们需要时再调用。 前言 js中的call(), apply()和bind()是Function.prototype下的方法,都是用于改变函数运行时上下文,最终的返回值是你调用的方法的返回值,若该方法没有返回值,则返回undefined。这几个方法...

    chaosx110 评论0 收藏0
  • this总结【2】—— call/applybind

    摘要:和概览我们要将归为一类,单独归为一类三者的共同点是都可以指定和都是绑定在的原型上的,所以的实例都可以调用这三个方法至于为什么,看完这篇文章你就懂了如果你不懂什么是实例的话,请移步深入浅出面向对象和原型概念篇深入浅出面向对象和原型概念篇第一个 1.call/apply和bind概览 我们要将call/apply归为一类,bind单独归为一类 三者的共同点是都可以指定this call/...

    wudengzan 评论0 收藏0
  • js 面试官想了解你有多理解call,apply,bind?

    摘要:返回值这段在下方应用中有详细的示例解析。回调函数丢失的解决方案绑定回调函数的指向这是典型的应用场景绑定指向,用做回调函数。 showImg(https://segmentfault.com/img/remote/1460000019971331?w=1024&h=680); 函数原型链中的 apply,call 和 bind 方法是 JavaScript 中相当重要的概念,与 this...

    wuaiqiu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<