function argsAsArray(fn, arr) {
    return fn.apply(this, arr);
}
function argsAsArray(fn, arr) {
    return fn.call(this, ...arr);
}
function argsAsArray(fn, arr) {
    return fn(...arr);
}

applycall 都是 JavaScript 中函数的方法,它们允许你在指定的上下文中执行一个函数。这两个方法的主要区别在于它们接收参数的方式不同。

  1. apply 方法:

apply 方法接收两个参数:第一个参数是函数执行时的上下文(即 this 的值),第二个参数是一个数组或类数组对象,其中包含了传递给函数的参数列表。

示例:

function showInfo(age, country) {
    console.log(this.name + " is " + age + " years old and lives in " + country);
}

var person = {
    name: "John"
};

// 使用 apply 方法调用 showInfo 函数,设置上下文为 person 对象
showInfo.apply(person, [28, "USA"]);

输出:

John is 28 years old and lives in USA

  1. call 方法:

call 方法与 apply 类似,但它接收的参数是一个参数列表,而不是一个数组。第一个参数依然是函数执行时的上下文,接下来的参数是传递给函数的参数列表。

示例:

function showInfo(age, country) {
    console.log(this.name + " is " + age + " years old and lives in " + country);
}

var person = {
    name: "John"
};

// 使用 call 方法调用 showInfo 函数,设置上下文为 person 对象
showInfo.call(person, 28, "USA");

输出:

John is 28 years old and lives in USA

总结:applycall 的主要区别在于它们传递参数的方式。apply 使用一个数组或类数组对象作为参数列表,而 call 则直接接收一系列参数。这两个方法都允许你在特定的上下文中执行一个函数,从而实现对 this 关键字的控制。

this

在 JavaScript 中,this 关键字用于引用当前函数执行时的上下文对象。this 的值在不同的情况下会有所不同。

以下是一些常见的 this 绑定方式:

  1. 默认绑定:如果函数没有被特殊方式调用,则 this 绑定到全局对象。在浏览器环境中,全局对象是 window 对象;在 Node.js 中,全局对象是 global 对象。
function foo() {
  console.log(this);
}

foo(); // 在浏览器环境中输出 window,在 Node.js 中输出 global

  1. 隐式绑定:如果函数被一个对象的方法调用,则 this 绑定到该对象。
var obj = {
  name: "Alice",
  sayHello: function() {
    console.log("Hello, " + this.name);
  }
};

obj.sayHello(); // 输出 "Hello, Alice"

  1. 显式绑定:可以使用 call()apply() 方法显式地将 this 绑定到指定的对象。
function sayHello() {
  console.log("Hello, " + this.name);
}

var obj1 = { name: "Alice" };
var obj2 = { name: "Bob" };

sayHello.call(obj1); // 输出 "Hello, Alice"
sayHello.apply(obj2); // 输出 "Hello, Bob"

  1. new 绑定:如果函数在使用 new 关键字创建对象时调用,则 this 绑定到新创建的对象。
function Person(name) {
  this.name = name;
}

var alice = new Person("Alice");
console.log(alice.name); // 输出 "Alice"

需要注意的是,在箭头函数中,this 的值与包含它的作用域保持一致,而不是根据调用方式动态绑定。这意味着箭头函数中的 this 始终与其声明时的上下文相同,无法通过 call()apply() 方法来改变。

var obj = {
  name: "Alice",
  sayHello: () => {
    console.log("Hello, " + this.name);
  }
};

obj.sayHello(); // 输出 "Hello, undefined"

let sayHello = () => {
    console.log("Hello, " + this.name);
  }
sayHello.call(obj); // 输出 "Hello, undefined"

总之,在使用 this 时需要注意它的绑定方式,以确保代码行为符合预期。