Nodejs中javascript的call 到底什么意思啊,怎么用啊?

Nodejs中javascript的call 到底什么意思啊,怎么用啊?

一直不理解call() 是什么意思啊。。 到底怎么用啊。 call()看上去很高深的样子。

8 回复

当然可以!让我们来详细解析一下 call() 方法在 Node.js 中的作用以及如何使用它。

什么是 call()

call() 是 JavaScript 中的一个内置方法,用于调用一个函数,并且指定该函数内部的 this 值。换句话说,它允许你在调用函数时明确地设置该函数执行时的上下文(即 this 的值)。

如何使用 call()

call() 方法接受两个参数:

  1. 第一个参数是要作为函数内部 this 值的对象。
  2. 其余参数是传递给该函数的参数列表。

示例代码

假设我们有两个对象 obj1obj2,并且有一个函数 sayHello,我们想让 sayHello 函数分别在 obj1obj2 的上下文中运行。

const obj1 = {
    name: 'Alice'
};

const obj2 = {
    name: 'Bob'
};

function sayHello(greeting) {
    console.log(`${greeting}, ${this.name}!`);
}

// 使用 call() 方法将 sayHello 函数绑定到 obj1 上下文中
sayHello.call(obj1, "Hello"); // 输出: Hello, Alice!

// 使用 call() 方法将 sayHello 函数绑定到 obj2 上下文中
sayHello.call(obj2, "Hi");   // 输出: Hi, Bob!

解释

  • 在上述代码中,sayHello.call(obj1, "Hello") 调用了 sayHello 函数,并将 obj1 作为 this 的值。因此,在 sayHello 函数内部,this 指向了 obj1,所以输出了 "Hello, Alice!"
  • 同样地,sayHello.call(obj2, "Hi")this 设置为 obj2,所以输出了 "Hi, Bob!"

通过这种方式,你可以灵活地控制函数内部的 this 值,从而实现更复杂的功能。

希望这能帮助你更好地理解和使用 call() 方法!


下面是mdn的文档链接

call

bind

apply

对象 A 有属性 attr 和方法 do(); 对象 B 有属性 bttr

B想用A的方法do 怎么调用呢? 你怎么写 不能写成 A.do()啊 这是A调用自身的方法 这是就需要call了 A.do.call(B) 把B call过来 执行方法

这个如果说可以牵扯出JavaScript中太多太多的东西了, 上面haoxin也给出了相关的资料,这里我献丑简单的说下我的理解吧,

在JavaScript中最迷人的就是函数,而函数也是对象,所以函数也就拥有了属性和方法,每一个函数都拥有两个属性,一个是lengthprototype。这里主要说call()所以其他的就不多说,

在js中每个函数都有两个方法:call(),apply()。这两个方法的作用就是设置函数体内this指向的值。如下面这个例子:

function sum(n1, n2){
    return n1 + n2;
}

function sum1(n1, n2){ return sum.call(this, n1, n2); }

console.log(sum1(1, 3)); //结果是4

call传递的参数第一个是运行函数所在的作用域,一般情况我们使用的时候是this.当然也可以直接指定作用域,比如:

        var name = "Jim";

        var p2 = {
            name: "Tang",
            age: 25
        };

        function say(){
            console.log(this.name);
        }

        say();       //Jim

        say.call(p2);    //Tang

后面跟多个直接的参数,这个参数也就是当前使用函数的参数个数比如sum()有几个参数就传递几个参数。这个haoxin给的链接说明了call。而apply()只接受两个参数,一个是作用域,一个参数的数组(也可以是arguments对象)。这个你可以参考上面的链接资料。

当然call()的真正作用还很大。它的作用还可以发挥在继承上面,这里演示一种继承方式:

        function P1(name){
            this.name = name;
            this.say = function(){
                console.log('my name is %s', this.name);
            };
        }
    function P2(name){
        P1.call(this, name);
    }

    var p = new P2("Jim");

    p.say();      //这里的结果就是‘my name is Jim’

熟练使用call()可以帮助我们很多!

ls 答案赞

这个解释有点意思

写的不错 赞!

function b(){ 有个锅 }

function a(){ 会炒菜 }

b说:a 帮我炒个菜 a说:好的,你先把你的锅给我,再找几份个原料,

a.call(b,原料1,原料2,…);

// function P2(name){ P1.call(this, name); } p2 啥也不会,但是知道p1会,于是对外宣称自己会,底下和p1商量,你帮我来但是得算我的。

call() 是 JavaScript 中的一个内置函数,属于 Function.prototype。它允许您在一个指定的对象上下文中调用一个函数,并可以传递参数给该函数。这在处理函数作用域或需要动态设置 this 的上下文时非常有用。

简单来说,call() 可以让你改变函数执行时的上下文(即 this 的值),并且可以立即执行该函数。

基本语法

function.call(thisArg, arg1, arg2, ...)
  • thisArg:在函数调用时使用的 this 值。
  • arg1, arg2, ...:将传递给函数的参数列表。

示例代码

假设我们有两个对象,其中一个对象有一个方法,而另一个对象想要借用这个方法并使用自己的上下文:

const obj1 = {
    name: 'Alice',
    greet: function() {
        console.log(`Hello, I'm ${this.name}!`);
    }
};

const obj2 = {
    name: 'Bob'
};

// 使用 call 方法让 obj2.greet 方法使用 obj1 的上下文
obj1.greet.call(obj2); // 输出 "Hello, I'm Bob!"

在这个例子中,greet 方法原本是定义在 obj1 上的。但是通过 call 方法,我们可以在 obj2 的上下文中执行 greet 方法,因此输出的是 Bob 而不是 Alice

更多示例

call 还可以用于继承场景中,例如:

function Person(name) {
    this.name = name;
}

Person.prototype.sayName = function() {
    console.log(`My name is ${this.name}`);
};

function Student(name, grade) {
    Person.call(this, name); // 在 Student 构造函数中使用 Person 构造函数的上下文
    this.grade = grade;
}

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

const student = new Student('Charlie', 'A');
student.sayName(); // 输出 "My name is Charlie"

在这个例子中,call 方法用于在 Student 构造函数中初始化 name 属性,从而继承了 Person 类的属性和方法。

回到顶部