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
.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)}