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