Javascript对象从自身调用函数

时间:2013-05-30 16:25:35

标签: javascript function object prototype

我一直在阅读使用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!');
    }
};

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

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

someObject.start();

4 个答案:

答案 0 :(得分:6)

JavaScript名称为lexically scoped,因此只要在脚本中遇到名称(变量),JavaScript运行时就必须搜索定义函数的范围。

在定义时,这个功能:

start: function() {
    check();
}

无法访问其外部作用域中的任何check函数。声明self并将其绑定到this是一种用于处理(有点有趣)intricacies of referring to the current object in JavaScript的技术(因为示例代码使用window.setInterval)。

要引用当前对象中的函数,只需使用this

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

答案 1 :(得分:1)

声明和初始化变量(如“self”)的目的是处理this的值在每次函数调用时重新确定的事实。如果你有一个嵌套在另一个函数中的函数,并且该内部函数需要从外部上下文访问this的值,那么this必须保存在另一个变量中 - 你自己的“自我”案件。 (当然,该变量的名称并不重要。)

在您的示例代码中:

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

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

在你的第二个例子中,声明和初始化一个“self”变量不会伤害任何东西,但这是不必要的。有时候它只是为了澄清代码而有用,但当然一个比“自我”更有意义的名字是一个好主意。

答案 2 :(得分:1)

这是javascript函数上下文,每次创建函数时,都会创建一个新的上下文(范围)。

setInterval()功能中,您创建了一个新范围,因此this不再引用上述this

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

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

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

更多信息:

答案 3 :(得分:0)

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