Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么可以';我是否存储对$(elem)的引用。是否稍后显示并调用它?_Javascript_Jquery - Fatal编程技术网

Javascript 为什么可以';我是否存储对$(elem)的引用。是否稍后显示并调用它?

Javascript 为什么可以';我是否存储对$(elem)的引用。是否稍后显示并调用它?,javascript,jquery,Javascript,Jquery,当我运行下面的代码时: 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();

当我运行下面的代码时:

  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中所做的。我不明白这里出了什么问题

编辑:这些评论并没有真正帮助我理解这个问题。这个是怎么丢失的?它变成了什么?为什么?为什么
(divs.eq(1.show))不会发生这种情况

当调用
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);
divs.eq(3).show
是这个功能代码(通过
console.log(g)
检查它):

这就是人们一直提到的


函数
g
需要应用于某个对象。在第一种情况下,它是一个jQuery元素(div)。但是在第二种情况下,它是
#document
元素。

正如注释中已经解释的那样,它不起作用,因为
show()
取决于
this
的值

的值取决于函数的调用方式:

  • 当被称为“普通”函数(
    foo()
    )时,
    将引用全局对象或
    未定义的
    (在严格模式下)
  • 当被称为对象方法(
    obj.foo()
    )时,
    引用对象(
    obj
理解这个在JS中是如何工作的是至关重要的。见:


这是一个有趣的问题
.show()
取决于
this
的值,当您单独访问该方法并将其调用到各个步骤时,该值会发生变化。结果是一个没有上下文的函数,我将函数作为参数传递给另一个函数。这不仅仅是一个函数,它是一个具有上下文的方法,当您将该方法存储在variable@Alnitak这似乎是由于。规范调用了
delete
typeof
作为原因(我假设避免破坏
delete(obj.foo);
)。
this
的值设置为调用函数“不,不是”。@FelixKling我的错误。我修好了,为什么是文档元素?这样做的目的是什么?最初,
g
函数是jQuery对象的一部分。通过引用,您“从元素中获取了函数的副本”。由于现在
g
属于文档(请记住
document.ready
上下文),它适用于那里。“它是#document元素。”-它不是
window
?@nnnnnn不,做一个控制台。在小提琴上记录(这个)以进行验证。让我更明确地说:
this
window
。您将就绪处理程序(
文档
)中的
this
的值与
显示
方法中的
this
的值混淆,如
g
窗口
)。如果要使用
console.log(this)
进行检查,则必须将其添加到
show()
中。为什么?为什么不保留此的值?我可以随时轻松地获取全局对象或未定义的对象。@Alex:因为函数是一类对象。它们不属于任何东西。考虑下面的内容:<代码> var fo= {bar:函数(){}};var foo2={bar:foo.bar}。当我调用
foo2.bar()
时,这个
应该指什么?这只是JavaScript是如何设计的,是什么让它如此灵活。Python是不同的,因为类方法会自动绑定到实例。在Python中,如果您有两个相同类的实例,并且执行了
inst.method==inst2.method
,您将得到
false
,在JavaScript中,您将得到
true
(假设已将这些方法添加到原型中)。Python将方法自动绑定到新实例(这有效地为每个实例创建了一个新函数),JavaScript则没有。
(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}