【问题标题】:jQuery: Add function self to array?jQuery:将函数 self 添加到数组?
【发布时间】:2012-01-16 15:38:04
【问题描述】:

给定一个函数,像这样:

var allev = new Array();
function events(index) {
    allev[index] = $(this); // doesn't work
}

有什么办法可以让这个以上述方式工作,还是我总是被限制在:

var allev = new Array();
function events(index) {
    // ...
}

function() { // out of scope, so make objects global
    var count = allev.length;
    var inst = events(count);
    allev[count] = inst;
}

如果有比上述两个更好的选择,我也愿意接受。

【问题讨论】:

  • 首先,当你打电话给$(this),据我所知,它并没有指任何东西。
  • @Ken,$(this) 指的是function events(index)...
  • @BrianGraham:this 将是 window,除非您使用 .call.apply 调用它。
  • 目前还不清楚事件的外部范围是什么。意思是,事件是另一个对象的一部分,或者只是连接到全局范围。如果“this”是对全局范围的引用......那么这就是它失败的原因。
  • @Rocket 是对的。这是一个函数,而不是一个方法。 this 将是全局对象,或在严格模式下未定义。

标签: javascript jquery arrays function self


【解决方案1】:

当您在 JavaScript 中调用函数(而不是方法)时,this 是全局对象,或者在严格模式下 undefined。所以像上面那样使用this 将永远无法工作。

可以这样做:

function events(index) {
    arr[index] = arguments.callee;
    alert("Hi");
}

但如果您曾经使用严格模式(这实际上是一个非常好的主意),那将会破坏

你也可以这样做:

function events(index) {
    allev[index] = this; // will work if you call with apply or call
}

当且仅当,您只像这样调用events

events.call(events, 12);

callapply 都允许您在函数调用内部指定 this 将等于什么。不同之处在于call 期望列出所有参数,而apply 期望所有参数都以数组形式传递。所以上面将等价于

events.apply(events, [12]);

DEMO

【讨论】:

    【解决方案2】:

    我决定多研究一下 jQuery API,然后找到了$.proxy。它完全符合我的要求,无需通过自身方法使this 正常工作。

    allev[index] = $.proxy(function() { return this; }, this);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多