javascript - function.apply(argument1, array) 不从数组中获取所有值

标签 javascript

function.apply 未在我的数组中注册第一个参数(索引 0)。

我尝试过剩余/扩展语法,并且 下面的代码似乎工作正常:

let sayName = function (object, ...languages) {
    console.log(`My name is ${this.name} and I speak ${languages.join(', ')}`);
};

let stacy = {
    name: 'Stacy',
    age: 34
};

let languages = ['Javascript', 'CSS', 'German','English', 'Spanish'];
sayName(stacy, ...languages);

但是下面的代码不起作用,显式绑定(bind)function.apply:

let languages1 = ['Javascript', 'CSS', 'German','English', 'Spanish'];
sayName.apply(stacy, languages1) 

结果总是遗漏数组中的 0 索引,即“Javascript”不包含在输出中。

我做错了什么?

最佳答案

您的函数似乎需要一个 object 参数,但从您如何使用 apply 调用它来看,这是不正确的。当您调用 applycall 时,该方法的第一个参数用于设置函数执行上下文的 this 值。它不会作为参数传递。

当您的函数引用 this 时,正确设置 this 非常重要,因此使用 applycall 是不错的选择。

所以改变:

let sayName = function (object, ...languages) {

至:

let sayName = function (...languages) {

请注意,您在函数代码中无论如何都没有使用 object

在不调用 apply 而是直接调用该函数的版本中,您可以:

sayName(stacy, ...languages);

...但是这里的 this 对象不会被正确设置。您应该使用 call 来确保 this 引用 stacy:

sayName.call(stacy, ...languages);

查看 apply 的文档:

Syntax

function.apply(thisArg, [argsArray])

Parameters

thisArg

Optional. The value of this provided for the call to func. [...]

argsArray

Optional. An array-like object, specifying the arguments with which func should be called. [...]

面向对象编程,一种更好的方法

现在,退一步来说,您确实应该将 sayName 定义为原型(prototype)方法,并像这样构造 stacy:

class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    sayName(...languages) {
        console.log(`My name is ${this.name} and I speak ${languages.join(', ')}`);
    }
}

let stacy = new Person('Stacy', 34);
let languages = ['Javascript', 'CSS', 'German','English', 'Spanish'];
stacy.sayName(...languages);

...为什么不实际将一个人所说的语言也存储为属性,并从方法中删除 console.log ,因为应该由调用者决定将应进行输出(可能输出到文件或 HTML 元素):

class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
        this.languages = [];
    }
    speaks(...languages) {
        this.languages = languages;
    }
    introduction() {
        return `My name is ${this.name} and I speak ${this.languages.join(', ')}`;
    }
}

let stacy = new Person('Stacy', 34);
stacy.speaks('Javascript', 'CSS', 'German','English', 'Spanish');
console.log(stacy.introduction());

关于javascript - function.apply(argument1, array) 不从数组中获取所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54721635/

相关文章:

javascript - Json解析嵌套数组

php - 在 PHP 中获取 Json 表单数据

javascript - 父级的 stopPropagation 正在禁用孙子级的功能

javascript - Rxjs 映射和过滤数组 - 返回单个对象而不是一个数组?

javascript - 为什么选择文件时此表单不自动提交?

javascript - 将 html 文件中的博客文章内容加载到模板中,然后加载到索引文件中

javascript - 我们需要在 JavaScript 中使用 “unset” 变量吗?

javascript - 在 React 中使用映射函数之外的变量

javascript - 如何测试CKEditor对话框是否有组件?

javascript - 当 num > 2147483647 时按位或导致溢出