将“这”的范围纳入内部功能

时间:2011-03-02 23:20:45

标签: javascript jquery class scope

如何向内扩展此范围?我想重新分配一个更高范围的变量就可以解决问题......我做错了什么? 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();
});

2 个答案:

答案 0 :(得分:4)

在您的代码中,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。检查左边的菜单。)


编辑:

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

init方法内,this指的是您以此方式调用时创建的Player

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

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


EDIT2: 此外,如果始终要从您创建的init()实例的上下文中调用Player,您可能需要考虑放置它在prototype的{​​{1}}对象上。

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

Player

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

答案 1 :(得分:0)

你这里只有一个小错误。你将扩展分配给配置,这不是在这个,但是你稍后通过'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();