Javascript对象从自身调用函数

Javascript对象从自身调用函数,javascript,function,object,prototype,Javascript,Function,Object,Prototype,我一直在阅读HTML5和JavaScript的游戏设计,它向我介绍了对象。因此,在阅读了这本书并参与了这些项目之后,我决定将这些新发现的知识整合到我自己的项目中。所以我的问题是,对象可以或者应该调用它们自己的函数吗?例如: var someObject = { start: function() { check(); }, check: function() { console.log("Check!"); } }; someOb

我一直在阅读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();

当然,对象可以也应该调用自己的函数,这是在javascript中模拟OOP的唯一方法。我想说,这本书使用的实践,
self=this
是不好的,因为
this
可以自己使用,然而,在第一个示例中,它用于保留this的值,否则它将是函数本身的
this
,而不是外部类

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

在示例代码中:

var timer = {
    start: function() {
        var self = this;
        window.setInterval(function(){self.tick();}, 1000);
    },
    tick: function() {
        console.log('tick!');
    }
};
传递到
setInterval()
的函数需要使用“start”函数中的
this
的值。但是,当调用该间隔计时器函数时,
设置为其他值(在“严格”模式下为全局上下文或
null
)。因此,通过在实例化interval timer函数的上下文中保存
this
的值,其代码可以使用它访问timer对象

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

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

就定义而言,此函数:

start: function() {
    check();
}
无法访问其外部作用域中的任何
check
功能。声明
self
并将其绑定到
this
是一种用于处理的技术(有点有趣)(因为示例代码使用
window.setInterval

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

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

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

setInterval()
函数中,您创建了一个新的作用域,因此
不再与上面的
相同:

var self = this;
setInterval(function() {
    self.tick();
}, 1000);
您还可以手动绑定函数的适当上下文(这样您就不再需要
self
):


更多信息:


他们在
setTimeout
示例中使用它的原因是,它的回调是在全局范围内执行的,因此
setTimeout
回调中的
this
的值是
窗口
。为了保留对原始对象的引用,您必须使用该方法(将其存储在
self
中)或某种形式的
Function.bind()
“仿真”;只要不断告诉自己,说话的时候可能会把你的脚后跟放在一起……做这件事有多种原因。
var self=this
;一个完全不相关的原因是使脚本压缩更有效。@voithos阅读了整个答案,我只是说第二次使用不好,但第二个示例中并没有这样做
setInterval(function() {
    this.tick();
}.bind(this), 1000);