13

我一直在阅读使用 HTML5 和 JavaScript 进行游戏设计,它向我介绍了对象。因此,在阅读了这本书并参与了项目之后,我决定利用这些新发现的知识并将对象集成到我自己的项目中。所以这是我的问题,对象可以或应该调用自己的函数吗?例如:

var someObject = {
    start: function() {
        check();
    },
    check: function() {
        console.log("Check!");
    }
};

someObject.start();

这本书确实展示了一个带有计时器的例子:

var timer = {
    start: function() {
        var self = this;
        window.setInterval(function(){self.tick();}, 1000);
    },
    tick: function() {
        console.log('tick!');
    }
};

在带有计时器对象的示例中,它引用 self 以调用内部函数,这是否意味着我应该使用 self 来调用内部函数,或者这是对对象执行此操作的正确方法?还是最佳实践?提前致谢。

var someObject = {
    start: function() {
        var self = this;
        self.check();
    },
    check: function() {
        console.log("Check!");
    }
};

someObject.start();
4

4 回答 4

10

JavaScript 名称是词法范围的,因此每当在脚本中遇到名称(变量)时,JavaScript 运行时必须搜索定义函数的范围。

在定义点,这个函数:

start: function() {
    check();
}

无权访问check其外部范围内的任何功能。声明self和绑定它this是一种用于处理在 JavaScript中引用当前对象的(有些有趣的)错综复杂的技术(因为示例代码使用window.setInterval)。

要在当前对象中引用一个函数,使用this.

var someObject = {
    start: function() {
        this.check();
    },
    check: function() {
        console.log("Check!");
    }
};
于 2013-05-30T16:33:22.153 回答
3

它是 javascript 函数上下文,每次创建函数时,都会创建一个新的上下文(作用域)。

setInterval()函数中你创建了一个新的作用域,所以this不再像this上面那样引用:

var self = this;
setInterval(function() {
    self.tick();
}, 1000);

您还可以手动绑定函数的正确上下文bind()(因此您不再需要self):

setInterval(function() {
    this.tick();
}.bind(this), 1000);

更多信息:

于 2013-05-30T16:34:18.030 回答
1

声明和初始化像“self”这样的变量的目的是处理这样一个事实,即this在每次函数调用时重新确定 的值。当您有一个嵌套在另一个函数中的函数,并且该内部函数需要this从外部上下文访问值时,则this必须将其保存在另一个变量中 - 在您的情况下为“self”。(当然,该变量的名称并不重要。)

在您的示例代码中:

var timer = {
    start: function() {
        var self = this;
        window.setInterval(function(){self.tick();}, 1000);
    },
    tick: function() {
        console.log('tick!');
    }
};

传入的那个函数setInterval()需要使用this“start”函数的值。但是,当调用该间隔计时器函数时,this它被设置为其他内容(全局上下文或null“严格”模式)。this因此,通过在实例化间隔计时器函数的上下文中保存 的值,其代码可以使用它来访问计时器对象。

在您的第二个示例中,声明和初始化“自我”变量不会造成任何伤害,但这是不必要的。然而,有时它很方便,只是为了澄清代码,当然比“self”更有意义的名称是个好主意。

于 2013-05-30T16:30:30.157 回答
0

当然,一个对象可以并且应该调用它自己的函数,这是在 javascript 中模拟 OOP 的唯一方法。我会说这本书使用的做法self = this很糟糕,因为this可以单独使用,但是在第一个示例中,它用于保留 this 的值,否则它将是this函数本身的值,而不是外部类

于 2013-05-30T16:28:28.137 回答