Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中,需要帮助包装函数和处理;这";适当地_Javascript_Function_This - Fatal编程技术网

在javascript中,需要帮助包装函数和处理;这";适当地

在javascript中,需要帮助包装函数和处理;这";适当地,javascript,function,this,Javascript,Function,This,我开始尝试创建一个计时器函数,让我包装一个回调函数,以便以后可以动态地改变行为 这使我普遍认识到,我真的还不了解函数,而且肯定不了解“This”发生了什么 我在上设置了一个测试环境 如果我使用set1方法,那么回调就不起作用。 所以我正在尝试set2方法。这让我找到了play方法,但“This”并不是指somefunc的实例 我以为我走对了路,但“这”一词的混淆让我感到困惑 任何线索都是受欢迎的。问题是,与python这样的语言不同,当您将一个dafunc.play传递到其他地方(callbac

我开始尝试创建一个计时器函数,让我包装一个回调函数,以便以后可以动态地改变行为

这使我普遍认识到,我真的还不了解函数,而且肯定不了解“This”发生了什么

我在上设置了一个测试环境

如果我使用set1方法,那么回调就不起作用。 所以我正在尝试set2方法。这让我找到了play方法,但“This”并不是指somefunc的实例

我以为我走对了路,但“这”一词的混淆让我感到困惑


任何线索都是受欢迎的。

问题是,与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);