javascript - 在javascript中需要帮助包装函数并正确处理 "this"

标签 javascript function this

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

这让我普遍意识到我真的还不了解函数,而且绝对不了解“this”发生了什么

我在 jsfiddle 上设置了测试环境

myns = {};
myns.somefunc = function(txt) {
    this.data = txt;
    this.play = function() {
        alert(this.data + ' : '+dafunc.data);
    };
};

var dafunc = new myns.somefunc('hello world');

myns.Timer = function(msec, callback) {
    this.callback = null;
    this.timerID = null;

    this.ding = function() {
        this.callback();
    };

    this.set1 = function( msec, callback ) {
        this.stop();
        this.callback = callback;
        this.timerID = setTimeout(this.ding, msec );
    };

    this.set2 = function( msec, callback ) {
        this.callback = callback;
        var wrappedDing = (function(who) {
            return function() {
                who.ding();
            };
        })(this);
        this.timerID = setTimeout(wrappedDing, msec );
    };
    //this.set1(msec, callback);
    this.set2(msec, callback);    
};

var ttimer = new myns.Timer(1000, dafunc.play);

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

我以为我走在正确的轨道上,但“这个”的混淆让我感到困惑。

欢迎提供任何线索。

最佳答案

问题是,与 python 等语言不同,当您使用 dafunc.play 并将其传递到其他地方(回调 = dafunc.play)时,它忘记了它与 dafunc 相关联,您还需要使用另一个包装函数,就像您在 set2 函数中所做的那样。

var ttimer = new myns.Timer(1000, function(){ return dafunc.play(); });

自己制作所有额外的功能很烦人。您可以改为使用在较新的浏览器中可用的绑定(bind)方法:

var wrappedDing = this.ding.bind(this);

new myns.Timer(1000, dafunc.play.bind(dafunc) );

或者如果您也需要支持旧版本的 IE,您可以使用类似的填充程序。


最后,如果您不打算利用某种形式的继承或动态绑定(bind),您可以改写代码以使用闭包。因为一切都是词法范围的,所以你不必再担心 this 了:

(顺便说一句,我最终简化了过程中的代码...)

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);

最后一件事:如果您不讨厌自己,请使用 console.log 以及浏览器的调试器和开发控制台,而不是使用警报输出。

关于javascript - 在javascript中需要帮助包装函数并正确处理 "this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406230/

相关文章:

javascript - td 元素上的 OnClick 函数返回第一列值和标题值

.net - VB.NET函数以字符串形式获取属性名称

c - 程序C计算奇数位总数

javascript - 使用 ng-href 打开短信应用

javascript - 等待链式可观察量完成

javascript - 在 JavaScript 中使用 for 循环为音频文件分配不同的源

Javascript 使用在函数外部声明的变量返回值 + undefined

javascript - YDKJS - 'this' 是如何工作的?

java - 为什么我们不能在静态方法中使用 'this' 关键字

java - "this"指向哪里?