4

我已经很长时间没有使用Javascript了,今天我一直在刷新它。一直让我感动的是关键字。我知道在jQuery事件处理程序中,例如click事件,引用触发事件的元素。情况如何传递给我作为回调函数的函数,即使我的函数没有参数?

给定以下代码:

$(“tr.SummaryTbRow”).data(“动画”,false);$(“tr.SummaryTbAltRow”).data(“动画”,false);$(“tr.SummaryTbRow”).单击(函数(){if($(this).data(“动画”)==false){if($(this).next(“.Graph”).css(“display”)==“none”){$(this).data(“动画制作”,true);//第二部分我提出质疑。setTimeout(函数(){$(this).data(“动画”,false);}(本条)第550条;$(this).next(“.Graph”).slideRow('向下',500);}其他{$(this).data(“动画”,true);$(this).next(“.Graph”).slideRow('up',500);}}});

我正试图找出如何用类传递元素表行汇总T行到setTimeout回调函数。jQuery是否通过与我的匿名回叫功能类似?我的函数内部引用我过去了?

我知道我可以:

setTimeout(函数(元素){$(element).data(“动画”,false);}(本条)第550条;

但我想弄清楚jQuery是如何通过调用回调函数,即使我的函数有0个参数。

1

4个答案4

重置为默认值

要回答最后一个问题,可以使用for example将您选择的接收器传递给javascript中的函数呼叫:

someFunction.call(someObject);

内部some函数,some对象.

就你而言,你似乎想要的是

setTimeout(函数(元素){$(element).data(“动画”,false);},550,本);//这将作为元素传递给回调

或(更加兼容)

var _this=此;setTimeout(函数(){$(_this).data(“动画”,false);},550);
2
  • 我明白了,这把事情弄清楚了。我不知道有电话。我必须利用这一点。
    – 贾斯廷
    2012年9月26日19:28
  • 你很少需要使用呼叫绑定直接。对于jQuery的大多数标准用法,您可以简单地将变量嵌入闭包中(我的最后一个示例)。 2012年9月26日19:31
2

简短回答:

您可以设置使用函数的.call().apply()方法。

详细答案:

这个任何函数上的变量都类似于论据变量(这可能是你不知道的)。它是在调用函数时设置的,是函数调用方式的工件。为了解释,让我先演示一下论据考虑:

myFunction=函数(){返回参数.length;};

现在让我们来看几个电话myFunction(我的功能):

myFunction()//是0myFunction(空)//是1myFunction(未定义)//是1myFunction(0,0,00,0)//是5

正如您所见参数.长度并不取决于我们如何或在何处编写函数,而是取决于我们打电话函数。对于变量(也称为“调用对象”)。设置调用对象的方法只有三种(ES5中有第四种,但我们将忽略这一点):

  1. 您可以使用点表示(例如。something.myFunction())
  2. 您可以使用函数的.call().apply()方法(例如。myFunction.call(someObject))
  3. 如果没有使用方法#1或#2进行设置,它将默认为全局对象(例如。窗口)

所以大多数人都习惯了第一种方法。如果将函数指定为对象的属性,然后使用对象和点表示法调用该函数,则对象将设置为如此:

var myFn=(function(){return this.x});var myObj={x: 1、,y: 我的Fn};myObj.myFn()//是1

但我们也可以使用方法2,如果我的Fn不是我们要调用的对象的属性,但该对象的形式正确我的Fn能够对此采取行动(参见:duck typeing):

var myOtherObj={x: 2个}myFn.call(myOtherObj)//是2myFn.apply(myOtherObj)//是2myFn.apply({x:3})//是3

很酷,嗯?jQuery就是这样做的.apply(事件.target)(设置事件的目标对象)。他们以更复杂的方式进行这项工作,因为回调框架,但想法是有的.

无论如何,如果我不解释一下方法#3,我不会给出一个很长的答案,因为它会让一些人发疯:如果你不设置调用对象会发生什么?

因为所有全局变量都是全局对象的隐式属性,所以您可以从方法#3中获得一些有趣的效果。例如:

var x=4;myFn()//是4

但大多数情况下,您都没有足够幸运地使全局对象满足函数对其调用对象的要求,因此通常只会导致错误和很多挫折。

可能比您想要的要多,但希望您现在对调用对象及其狡猾的方式有了更多的了解。

2
  • 达恩,接受了另一个回答。这就是我花了15分钟提供一个完整答案的原因,其中引用了消息来源并提供了完整的解释。哦,好吧。
    – 皮特
    2012年9月26日19:35
  • 我等了你一会儿皮特。我不确定你是否还在继续。你肯定详细介绍了jQuery是如何做到这一点的,以及更多相关信息。
    – 贾斯廷
    2012年9月26日23:21
1

可以使用调用函数fn.call(电话)fn.应用这两种方法都采用上下文参数,用于.

0

应用,呼叫绑定方法就是为了这个目的。在您的案例中,您只需写下:

setTimeout(函数(){$(this).data(“动画”,false);}.绑定(this),550);

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问自己的问题.