“什么是”呢;我";在;功能(i)“;在下面的JavaScript中?
在下面的代码中有“function(i)”,但在此语句之前的任何地方都没有声明“i”“什么是”呢;我";在;功能(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
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; };