“什么是”呢;我";在;功能(i)“;在下面的JavaScript中?

“什么是”呢;我";在;功能(i)“;在下面的JavaScript中?,javascript,jquery,Javascript,Jquery,在下面的代码中有“function(i)”,但在此语句之前的任何地方都没有声明“i” ul.css({width: 10, overflow: 'visible'}).retarder(100, function(i){ i.css('visibility', 'visible').animate( {width: ul[0].wid,left:-50}, {duration: 500, complete : function(){ ul.css

在下面的代码中有“function(i)”,但在此语句之前的任何地方都没有声明“i”

ul.css({width: 10, overflow: 'visible'}).retarder(100, function(i){
   i.css('visibility',  'visible').animate(
      {width: ul[0].wid,left:-50},
      {duration: 500, complete : function(){
         ul.css('overflow',  'visible');
      }}
   );
});

它看起来类似于C++的“这个”语句。这完全正确吗?

变量
i
表示实际对象(如关键字
this


进一步解释:

1) 是匿名函数的参数,如我们所见:

.retarder(100, function(i){...})
2) 是对当前对象的引用(

此jquery插件完成后,将使用以下命令调用回调函数:

(callbackFunction)(this)

此处为参数。

匿名函数声明函数(i)中的变量i是函数体中第一个参数的名称。它与页面其他地方的任何变量都不对应。

它看起来像一个函数声明:

function(i)
{
  // .....
}
因此,
i
是作为其第一个参数传递到函数(被内联声明为匿名函数)的值,可能是通过传递函数的
延迟器
方法的内部工作实现的

重新编写代码,使其更具可读性,使其更清晰:

ul.css(
  {
    width: 10, 
    overflow: 'visible'
  }
).retarder(100, function(i)
  { 
    i.css('visibility', 'visible').animate(
      {
        width: ul[0].wid,
        left:-50
      },
      {
        duration: 500, 
        complete: function()
          { 
            ul.css('overflow', 'visible'); 
          }
       } 
    );
  }
 );
然后你可以把它改写得更清楚:


它是一个函数参数。

它创建一个匿名函数,该函数使用一个参数,然后在函数中称为
i

i
只是一个函数参数,由
函数传递给匿名函数

它所做的是:

ul.css({width: 10, overflow: 'visible'}).retarder(100, callback_function);
通过匿名函数定义回调:

function(i) { ... }  

因此,
i
是匿名函数参数的定义。

您可能不理解这一点的原因是您不熟悉JavaScript中匿名函数的使用。您可能更熟悉以下内容:

function double(i){
    return i + i;
}
i
是函数
double
的一个参数。在JavaScript中,同样的功能可以执行如下操作:

var double = function(i){
    return i + i;
};
在这种情况下,将创建一个匿名函数,然后将其分配给变量
double
<代码>i
仍然只是一个参数。然后可以像
double(3)
那样调用这两个函数


在您提供的示例中,不是将匿名函数分配给变量,而是将其作为参数传递给另一个函数。

如果您试图解码我认为是的模糊代码,那么您可能正在查找此函数定义

$.fn.retarder = function(delay, method){ 
var node = this; 
if (node.length){ 
    if (node[0]._timer_) 
        clearTimeout(node[0]._timer_); 
    node[0]._timer_ = setTimeout(function(){ method(node); }, delay); 
} 
return this; }; 
我必须深入挖掘才能找到它,因为它是在eval()中动态生成的

为了回答您的问题,“i”参数是“ul”对象(在您发布的代码中)

如果您看一下deterder函数,它会返回“this”,就像大多数其他jquery插件一样,所以它保持了插件的链接能力


消除模糊不是很有趣吗?

@Aviral,yeup,没错,…)为什么要投否决票?答案当然是正确的,即使不详细。解释一下你自己。+1投了赞成票,因为缺少来自反对票者的评论:-)谢谢。这是我今天第三次遇到这种情况。真烦人。哈哈,现在你的答案比我的好。我真是个傻瓜:-))从技术上讲,这是一个参数:如果你想变得技术化,函数形式上只接受一个参数。可以想象,您可以传递许多参数并通过同名对象访问它们。正如其他人所提到的,它是匿名函数的参数。Buddy,是的,是匿名函数的参数…但是,在本例中,是一个表示实际对象的参数=this。这是一个作为参数的匿名函数。因此,我是函数接受的第一个参数。缓速器方法调用函数callback(10、11、12),从而为i提供一个值。在本例中,i=10,其他所有内容都被丢弃。顺便说一下,
i
对于该参数来说是一个可怕的名称,请将其更改为描述性名称
$.fn.retarder = function(delay, method){ 
var node = this; 
if (node.length){ 
    if (node[0]._timer_) 
        clearTimeout(node[0]._timer_); 
    node[0]._timer_ = setTimeout(function(){ method(node); }, delay); 
} 
return this; };