【问题标题】:Is there a better method than setting a variable to this?有没有比设置变量更好的方法?
【发布时间】:2011-04-04 00:34:18
【问题描述】:

在我的 javascript 对象中,我发现自己在写这个:

this_object = this;

似乎这是将成员变量传递给外部函数的唯一方法......

google.maps.event.addListener(this.marker, 'click', function() {
    this.info_window.setContent('Chicago marker');
    this.info_window.open(this.map,this.marker);
});

这不行,我必须将对象复制到成员变量中并传递新对象(并将所有this替换为this_object

这感觉很难看。是否有“更好”或“更清洁”的方式,或者这是我唯一的选择?

【问题讨论】:

标签: javascript oop callback javascript-objects


【解决方案1】:

当然有更好的方法。它涉及创建一个函数,该函数的 this 上下文已经绑定到特定对象。

要让this 上下文引用当前对象,请在函数上调用bind() 方法并将所需的上下文作为参数传递。

google.maps.event.addListener(this.marker, 'click', function() {
    this.info_window.setContent('Chicago marker');
    this.info_window.open(this.map,this.marker);
}.bind(this)); // <-- notice we're calling bind() on the function itself

这现在是 ECMAScript 标准的一部分,如果浏览器本身没有实现它,你自己也很容易实现。

if (!Function.prototype.bind) {
    Function.prototype.bind = function () {
        var fn = this,
            args = Array.prototype.slice.call(arguments),
            object = args.shift();

        return function () {
            return fn.apply(
                object, args.concat(Array.prototype.slice.call(arguments))
            );
        };
    };
}

在与此相关的 SO 上查看所有 questions and answers

【讨论】:

  • 这看起来比我的 javascript paygrade 高出几个档次,但我会尝试吸收它。谢谢
  • 这确实有引入额外函数调用的缺点,但仍然 +1。
【解决方案2】:

在处理 JavaScript 时,将this 的引用存储在局部变量(即var myThing=this;)中实际上是一种非常常见的模式。请记住,函数可以访问在其范围内定义的局部变量。包含函数中定义的任何变量都是可访问的。

【讨论】:

    【解决方案3】:

    您会发现这段代码在许多库和项目中非常常见:

    function someFunction() {
       var that = this;
    
       //....
    }
    

    例如,考虑这个函数:

    function container(param) {
    
        function dec() {
            if (secret > 0) {
                secret -= 1;
                return true;
            } else {
                return false;
            }
        }
    
        this.member = param;
        var secret = 3;
        var that = this;
    
        return function () {
            if (dec()) {
                return that.member + " " + secret;
            } else {
                return null;
            }
        };
    }
    
    var c = container("foo");
    alert( c() ); // "foo 2";
    alert( c() ); // "foo 1";
    alert( c() ); // "foo 0";
    alert( c() ); // null;
    

    阅读更多here

    【讨论】:

      【解决方案4】:

      我以前见过这种模式(有问题的变量被调用),所以我认为它确实是一种常见的 javascript 模式,不仅有更清洁的解决方案。

      【讨论】:

        【解决方案5】:

        我不确定这对您正在处理的任何场景都有帮助,但我发现 YUI 的自定义事件实用程序可以很好地解决与 this 和闭包有关的范围问题。这是一个事件驱动的模型,思维方式略有不同,但至少值得探索。

        http://developer.yahoo.com/yui/event/#customevent

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多