【问题标题】:Carrying scope of "this" into inner functions将“this”的范围带入内部函数
【发布时间】:2011-07-07 16:22:25
【问题描述】:

如何向内扩展此范围?我认为重新分配一个更高范围的变量可以解决问题……我做错了什么? http://jsfiddle.net/8bqXM/

function Player(configs) {

    this.opts = {
        playerID: "cSurf"
    };
    configs = $.extend(this.opts, configs);

    var the = this;

    this.init = function(){
        var $player = $("#" + the.configs.playerID);
        alert($player.attr("id"));
    }
}
var cSurf = new Player();
$(document).ready(function(){
        cSurf.init();
});

【问题讨论】:

    标签: javascript jquery class scope


    【解决方案1】:

    在您的代码中,configs 不是正在创建的 Player 对象的公共成员。您在没有 var 的情况下声明了它,所以它是一个全局变量。

    configs = $.extend(this.opts, configs);
    

    应该是:

    this.configs = $.extend(this.opts, configs);
    

    然后在您的init() 中您可以执行the.configs.playerID

    示例: http://jsfiddle.net/rCuXa/

    (您的 jsFiddle 还加载了 MooTools 而不是 jQuery。检查左侧的菜单。)


    编辑:

    顺便说一句,由于您是从新的 Player 对象的上下文中调用 init(),因此您确实不需要使用 the 作为对 this 的引用。 em>

    init 方法中,this 指的是当您以这种方式调用它时创建的Player

    var $player = $("#" + this.configs.playerID);
    

    示例: http://jsfiddle.net/rCuXa/1/


    EDIT2: 此外,如果总是要从您创建的 Player 实例的上下文中调用 init(),您可能需要考虑将其放在 @987654341 Player的@对象。

    这样它将在所有实例之间共享,而不是为每个实例重新创建:

    Player.prototype.init = function(){
                   // ---------v----------"this" is the instance of Player
        var $player = $("#" + this.configs.playerID);
        alert($player.attr("id"));
    }
    

    示例: http://jsfiddle.net/rCuXa/2/

    【讨论】:

      【解决方案2】:

      你只是在这里有一个小错误。您正在将扩展分配给配置,这不在此范围内,但是稍后您可以通过“the”引用它,就好像它是一样。这有效:

      function Player(configs) {
      
        this.opts = {
          playerID: "cSurf"
        };
        this.configs = $.extend(this.opts, configs);
      
        var the = this;
      
        this.init = function(){
          var $player = $("#" + the.configs.playerID);
          alert($player.attr("id"));
        }
      }
      var cSurf = new Player();
      cSurf.init();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 2012-09-23
        • 1970-01-01
        • 2014-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多