为什么我不能存储对$(elem).show的引用并稍后调用它?

时间:2016-05-14 19:18:37

标签: javascript jquery

See the jsfiddle.

当我运行以下代码时:

  var divs = $('div');

  // The first three methods of showing a div work
  divs.eq(0).show();
  (divs.eq(1).show)();
  var f = function() {
    divs.eq(2).show();
  }
  f();

  // But this doesn't. Why?
  var g = divs.eq(3).show;
  g();

最后一种方法没有显示div,并且控制台中没有错误。我想使用它,因为我想简洁地存储函数而不创建匿名功能块。这就是我通常在Python中所做的事情。我无法理解这里出了什么问题。

编辑:评论并没有真正帮助我理解这个问题。 this是如何迷路的?它改变了什么,为什么?为什么(divs.eq(1).show)();没有发生这种情况?

3 个答案:

答案 0 :(得分:3)

正如评论中已经说明的那样,它不起作用,因为show()取决于this的值。

this的值取决于函数如何调用

  • 当被称为“普通”函数(foo())时,this将引用全局对象或undefined(在严格模式下)。
  • 当作为对象方法(obj.foo())调用时,this引用对象(obj)。

了解this在JS中的工作原理至关重要。参见:

答案 1 :(得分:0)

当您致电g()时,this的值未设为divs.eq(3)。这是修复它的一种方法。

divs.eq(0).show();
(divs.eq(1).show)();
var f = function() {
  divs.eq(2).show();
}
f();

var div3 = divs.eq(3);
var g = div3.show;
g.call(div3);

答案 2 :(得分:0)

divs.eq(3).show是此功能代码(由console.log(g)检查):

(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}

this是人们所指的。

函数g需要应用于某些东西。那个东西,在第一种情况下是a jQuery element(div)。但在第二种情况下,它是#document元素。