javascript - 不明白为什么这个 JavaScript 函数可以用一种方式调用而不能用另一种方式调用

标签 javascript

我最近开始学习 JavaScript 是为了创建 HTML5 游戏,我遇到了一种我很难理解的行为。

例如,我有一个构造函数,它使用每次游戏更新时它们应该执行的一系列操作来初始化新 Sprite (例如动画、移动等)。 This JSFiddle演示了一个基本的实现。

本质上,我很困惑为什么这行不通...

Sprite = function () {

    this.actions = [this.animate];
};

Sprite.prototype = {

    animate: function () { /* animate the sprite */ },

    update: function () {

        this.actions[0]();  // doesn't do anything (?)
    }
};

...但这确实

Sprite = function () {

    this.actions = [this.animate];
    this.holder = 'whatever';
};

Sprite.prototype = {

    animate: function () { /* animate the sprite */ },

    update: function () {

        this.holder = this.actions[0];
        this.holder();  // executes animate function as desired
    }
};

在我没有经验的人看来,这两个示例似乎应该做完全相同的事情。那么,为什么如果我直接调用 this.actions[0]() 而没有发生任何事情,但是如果我将 this.actions[0] 分配给 this.holder 然后调用 this.holder(),它工作正常吗?

最佳答案

当一个函数被调用时,一个值将被分配给函数内部一个名为this的局部变量。

除非你做了一些改变它的事情(例如new, bind(), call(), apply() ),该值将是调用它的对象。在 bar 函数中使用 foo.bar() this === foo

this.actions[0]() 使 this 等于 actions 属性的值

this.holder() 使 this 等于调用函数中 this 的值。

您的函数必须依赖于 this 的值才能执行任何操作。

关于javascript - 不明白为什么这个 JavaScript 函数可以用一种方式调用而不能用另一种方式调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18354362/

相关文章:

javascript - 使用 javascript 以动态方式热图同一轴的多个数据标签

javascript - 在PHP中插入逗号分隔符和零位数字或数字

javascript - 无法弄清楚为什么我的 math.random 在 for 循环中返回错误的值

javascript - javascript中的单元测试简介

javascript - 单击按钮时的 map 刷新-Javascript

javascript - 单击时将 div move 到最高视口(viewport)

javascript - 如何将小时数添加到 Date 对象?

javascript - 将音频文件/blob 从 UI 发送到 Servlet 以保存在服务器上。

javascript - 如何将许多带有自定义文本的标记添加到 openlayers 5

javascript - 在 ng build angular 中运行严格编译