📜  什么是 fn.call (1)

📅  最后修改于: 2023-12-03 15:06:24.409000             🧑  作者: Mango

什么是 fn.call

在JavaScript中,函数是一等公民,这意味着我们可以像对待其他数据类型一样处理函数。而fn.call则是函数调用中一个常用的方法。

语法:fn.call(thisArg, arg1, arg2, ..., argN)

fn 代表的是需要被调用的函数,thisArg 指定了 fn 函数在执行时所使用的 this 值,后续的参数 arg1, arg2, ..., argNfn函数接受的参数。这样,通过fn.call(),我们可以在指定的上下文中调用函数,并传递参数,以便更好地掌握函数执行上下文。

下面我们来看一下具体的例子。

function sayHi() { 
  console.log("Hi, " + this.name); 
}

var person = { name: "John" };

// 使用 fn.call 方法
sayHi.call(person); // 输出 "Hi, John"

在此例子中,我们有一个函数 sayHi ,它输出了一个问候语句。现在我们已经知道如何使用fn.call()来调用该函数,并传递一个this值。在此示例中,我们传递了一个名为 person 的对象,该对象具有一个 name 属性。因此,输出的问候语包含了这个属性。

如果我们不使用 fn.call()方法,而只是简单地调用函数,输出结果会出现错误。事实上,sayHi() 函数中的 this 值会指向全局对象,从而导致输出错误的问候语。所以,在需要指定特定上下文的函数调用时,请务必使用 fn.call() 方法。

另外,我们还可以通过fn.call()来继承方法。

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

Animal.prototype.sayName = function() {
  console.log(this.name);
}

function Dog(name, age) {
  Animal.call(this, name);
  this.age = age;
}

Dog.prototype = Object.create(Animal.prototype);

Dog.prototype.constructor = Dog;

Dog.prototype.sayAge = function() {
  console.log(this.age);
}

var dog = new Dog("Buddy", 2);

dog.sayName(); // 输出 "Buddy"
dog.sayAge(); // 输出 2

在这个例子中,我们定义了两个构造函数:AnimalDogAnimal 函数具有一个 sayName 方法,而 Dog 构造函数继承了这个方法,同时还添加了一个新的方法 sayAge。在这里,我们使用了 fn.call() 来调用 Animal 函数,并将其上下文指定为 Dog 对象。这样,Animal 函数就可以访问 Dog 对象中的属性,进而实现了方法的继承。

综上所述,fn.call() 是 JavaScript 函数中重要的一种调用方法。它可以指定函数执行上下文中的 this 值,并传入其他参数,一定程度上增强了函数的表现能力。