有没有更好的方法在Javascript中引用外部范围?

时间:2009-09-15 20:15:56

标签: javascript scope

我最近看过很多这样的javascript方法:

var myObj = {
  dialogOptions: {...},
  init: function() {
    var $this = this;
    var something = $("<div/>").load("...", null, function() {
      $(this).dialog($this.dialogOptions);
    });
  }
}

现在,由于闭包的性质,这是有效的,但是对特定范围的范围的命名变量引用似乎很尴尬。我的问题是:

是否有一些javascript运算符在内部作用域上执行var $this = this;?或者,或许有一种方法来遍历对象层次结构以获取我在内部范围中寻找的属性?

3 个答案:

答案 0 :(得分:1)

简短回答:不。

答案很长:“问题”是this在一切都是对象的语言中的独特性。你不能选择何时这意味着 this 这个或者意味着其他这个。

这是你的javascript。你可以做很多事情,但并不总是漂亮。

答案 1 :(得分:1)

没有明确的方法可以避免这种情况。但是,有些库提供了将函数绑定到特定范围的方法 - 通常允许这样的语法:

(function() { /* do something */ }).bind(whatever)

根据您的喜好,这可能比在单独的变量中声明范围更清晰。上述语境中的绑定基本上是这样的:

Function.prototype.bind = function(scope) {
    var thisFunction = this;
    return function() {
        thisFunction.call(scope);
    };
};

答案 2 :(得分:1)

在这种情况下,如果myObj是全局(或全局可访问)变量,我经常会执行以下操作:

var myObj = {
  dialogOptions: {...},
  init: function() {
    var something = $("<div/>").load("...", null, function() {
      $(this).dialog(myObj.dialogOptions);
    });
  }
}