在javascript中,需要帮助包装函数和处理;这";适当地
我开始尝试创建一个计时器函数,让我包装一个回调函数,以便以后可以动态地改变行为 这使我普遍认识到,我真的还不了解函数,而且肯定不了解“This”发生了什么 我在上设置了一个测试环境 如果我使用set1方法,那么回调就不起作用。 所以我正在尝试set2方法。这让我找到了play方法,但“This”并不是指somefunc的实例 我以为我走对了路,但“这”一词的混淆让我感到困惑在javascript中,需要帮助包装函数和处理;这";适当地,javascript,function,this,Javascript,Function,This,我开始尝试创建一个计时器函数,让我包装一个回调函数,以便以后可以动态地改变行为 这使我普遍认识到,我真的还不了解函数,而且肯定不了解“This”发生了什么 我在上设置了一个测试环境 如果我使用set1方法,那么回调就不起作用。 所以我正在尝试set2方法。这让我找到了play方法,但“This”并不是指somefunc的实例 我以为我走对了路,但“这”一词的混淆让我感到困惑 任何线索都是受欢迎的。问题是,与python这样的语言不同,当您将一个dafunc.play传递到其他地方(callbac
任何线索都是受欢迎的。问题是,与python这样的语言不同,当您将一个dafunc.play传递到其他地方(callback=dafunc.play)时,它会忘记它与dafunc关联,儿子,您需要使用另一个包装函数,就像在set2函数中一样
var ttimer = new myns.Timer(1000, function(){ return dafunc.play(); });
自己做所有这些额外的功能是很烦人的。您可以改为使用在较新浏览器中可用的绑定方法:
var wrappedDing = this.ding.bind(this);
new myns.Timer(1000, dafunc.play.bind(dafunc) );
或者,如果您也需要支持旧版本的IE,也可以使用类似的垫片
最后,如果您不打算利用某种形式的继承或动态绑定,您可以重写代码以使用闭包。由于所有内容都是词汇范围的,因此您不必再担心
这个:
(顺便说一句,我最终简化了过程中的代码…)
最后一件事:如果您不讨厌自己,请使用console.log和浏览器的调试器和开发控制台,而不是使用警报作为输出。额外的包装器功能非常有效。谢谢你的快速修复。添加的材料非常值得思考。最后,我看到了新绑定方法的用途。(我的程序需要画布,所以我认为bind肯定会在那里)。我想研究你的简化,更好地理解它们。谢谢你的帮助。很抱歉发出警报。我有时使用它来停止程序流,以便在firebug脚本控制台中检查监视值。我一定会将jsfiddler转换为console.log。@Claude:不必为这个警报感到抱歉,我只是对这里的每个人说^^。
var wrappedDing = this.ding.bind(this);
new myns.Timer(1000, dafunc.play.bind(dafunc) );
myns = {};
myns.somefunc = function(txt) {
var obj = { data : txt };
obj.play = function() {
alert(obj.data);
};
return obj;
};
var dafunc = myns.somefunc('hello world');
myns.timer = function(msec, callback) {
var timerID = null;
var set = function(){
stop();
timerID = setTimeout(callback, msec);
};
set();
return {
set: set
};
};
var ttimer = myns.timer(1000, dafunc.play);