下面javascript定义了没名字的函数,这没名字的函数是不是自动调用?那个for()后面有两个()是什么意思
我先声明这只是网页中的javascript代码,在网页中运行也没有错误,而且显示的效果还特别的好,我就是想问那个没有函数名的函数到底是怎么回事,他是怎么被调用的,还有那个...
我先声明这只是网页中的javascript代码,在网页中运行也没有错误,而且显示的效果还特别的好,我就是想问那个没有函数名的函数到底是怎么回事,他是怎么被调用的,还有那个for(var i=0;i<n;i++ )(代码)();是什么意思?而且最后面的那个()不能去掉,不然运行的时候就达不到想要的效果;javascript代码如下(这是我在网上下载的代码):
<script language="javascript">
window.onload=function()
{
var a=document.getElementById("descript");
var w=a.clientWidth;
var n=30,t=20;
var time=new Array(n);
var c=document.getElementById("beni").getElementsByTagName("li");
for(var i=0;i<c.length;i++)
{
c[i].index=i;
c[i].onmouseover=dosild;
}
c=null;
function dosild()
{
var x=a.scrollLeft;
var d=this.index*w-x;
if(!d)
{
return ;
}
for(var i=0;i<n;i++)(function()
{
if(time[i])
clearTimeout(time[i]);
var j=i;
time[i]=setTimeout(function(){
a.scrollLeft=x+Math.round(d*Math.sin(Math.PI*(j+1)/(2*n)));
},(i+1)*t);})();
}
}
</script> 展开
<script language="javascript">
window.onload=function()
{
var a=document.getElementById("descript");
var w=a.clientWidth;
var n=30,t=20;
var time=new Array(n);
var c=document.getElementById("beni").getElementsByTagName("li");
for(var i=0;i<c.length;i++)
{
c[i].index=i;
c[i].onmouseover=dosild;
}
c=null;
function dosild()
{
var x=a.scrollLeft;
var d=this.index*w-x;
if(!d)
{
return ;
}
for(var i=0;i<n;i++)(function()
{
if(time[i])
clearTimeout(time[i]);
var j=i;
time[i]=setTimeout(function(){
a.scrollLeft=x+Math.round(d*Math.sin(Math.PI*(j+1)/(2*n)));
},(i+1)*t);})();
}
}
</script> 展开
展开全部
在这里无名函数的两个运用都在了!
第一个相当于C中定义的指针,或是C#中的委托,因为在JS中根本没有类似的术语,所以不妨这样理解,但不能说.比如
var ss = function(){//语句块};
也就是说将这个无名函数委托给了ss,也相当于C#中的委托机制的.经后在使用这个无名函数时直接使用ss();就可以了执行了,而不是将无名函数的执行结果反回给ss.而这样显然使用这个是将函数委托给了onload,那么不管何时调用onload时,显然是调用了这个无名函数的.但时,你要看清楚的是后边是一个;号,但在JS中可以省略的.
既然是委托,那么后一个无名函数也基本上可以这样理解,但它是直接的执行!比如刚才的例子中,ss()是执行,那么无名函数后边直接跟上()也是表示执行的.也就是说:function (){//语句块}();是一个语句,这个无名函数直接执行了!你要看清楚的是后边有一对括号的,而不是定义的那种方式!
如果是var ss = function(){//语句块};是一种委托,将无名函数传递给了ss,相当于function ss(){//语句块};但这两者还是有区别的,前一个是借用JS的闭包特性,解决了this这个指示的问题.所以你可以看到这两种形式,但不是所有时间都是通用的,有this时一定是不通用的.
如果是var ss = function(){//语句块}();是将无名函数的执行结果返回给了ss,一般这种情况下,语句块中一定有一个return返回值的,如果没有在执行时也会自动返回,但返回的却是null,也就是说在JS中定义的function若是没有return 这类似的语句时,则在执行完毕业时自动返回,相当于程序在你的最后一句执行了return ;这一语句的.
明白两者的结果,看清楚是定义还是执行,这就没有任何的问题了!
第一个相当于C中定义的指针,或是C#中的委托,因为在JS中根本没有类似的术语,所以不妨这样理解,但不能说.比如
var ss = function(){//语句块};
也就是说将这个无名函数委托给了ss,也相当于C#中的委托机制的.经后在使用这个无名函数时直接使用ss();就可以了执行了,而不是将无名函数的执行结果反回给ss.而这样显然使用这个是将函数委托给了onload,那么不管何时调用onload时,显然是调用了这个无名函数的.但时,你要看清楚的是后边是一个;号,但在JS中可以省略的.
既然是委托,那么后一个无名函数也基本上可以这样理解,但它是直接的执行!比如刚才的例子中,ss()是执行,那么无名函数后边直接跟上()也是表示执行的.也就是说:function (){//语句块}();是一个语句,这个无名函数直接执行了!你要看清楚的是后边有一对括号的,而不是定义的那种方式!
如果是var ss = function(){//语句块};是一种委托,将无名函数传递给了ss,相当于function ss(){//语句块};但这两者还是有区别的,前一个是借用JS的闭包特性,解决了this这个指示的问题.所以你可以看到这两种形式,但不是所有时间都是通用的,有this时一定是不通用的.
如果是var ss = function(){//语句块}();是将无名函数的执行结果返回给了ss,一般这种情况下,语句块中一定有一个return返回值的,如果没有在执行时也会自动返回,但返回的却是null,也就是说在JS中定义的function若是没有return 这类似的语句时,则在执行完毕业时自动返回,相当于程序在你的最后一句执行了return ;这一语句的.
明白两者的结果,看清楚是定义还是执行,这就没有任何的问题了!
追问
那个我基本上懂了,但是我的代码下面不是还有一个没名字的函数嘛,如下:
function(){
a.scrollLeft=x+Math.round(d*Math.sin(Math.PI*(j+1)/(2*n)));
}
它在setTimeout()里面怎么自动运行了?而当我把它放在setTimeout()外面的时候,它又不自动运行了,why?是不是只要在类似的语句块中定义没有名字的函数,这个函数都能自动运行呀?
追答
setTimeout是指定时间后执行相应语句,你注意一下,是执行相应语句,如果是一个函数时,直接写函数名,原因类似于那个所谓的委托,但理解时它就是一个语句,而不是一个定义。JS有点迷感人的地方是,如果是定义函数,后边不会有分号,但如果是一个语句,后面就会有分号,可问题是这个分号可以省略!所以必须先分清语句与函数的区别,依赖于分号就有些难度了!setTimeout是指定时间后执行的语句,但这个语句可以省略分号!你明白了吧?其实这个如果写在外边就是一个无名函数的定义,写在里边就是语句,相当于匿名委托,相当于直接将这个函数执行了!
有一点你必须肯定的是,setTimeout是一个已经存在的函数,在这里只是一个调用,至于它调用什么参数,是一句alert还是一个函数名,还是直接的语句都不能改变这是一个语句,里边不可能有函数的定义,只有执行!
另一点就是一种习惯了!setTimeout中的第一个参数加引号时,函数名后必须加(),不加是则不必加引号!
比如function ss() {//执行语句块}
setTimeout("ss();",100);
表示100毫秒后执行语句ss();
setTimeout(ss,100);表示100毫秒后执行ss块(也就是函数)!
两者是一样的,但你自己试一下:
setTimeout("ss",100);看一下能执行么?
也就是说如果你的这个匿名函数定义后有括号,那么外边可能会有引号,否则,如第二句的执行!
setTimeout(
function(){//执行语句块},
100
);
这样他会在100毫秒后启执行!
setTimeout("
function(){//执行语句块}();",
100
);
两者是一样的!
展开全部
这是javascript的闭包,你层级可能没看清楚,举个例子吧:
上面代码用的是这种形式( function(){return null;} )(),注意最前面那对括号包括了一个闭包函数function(){return null;},然后最后那个括号代表执行它,分开写就是
var func = function(){return null;};
func();
你的代码里面并不是for()后面又出来了个(),而是那个
(function(){
...
})后面多了对括号,表示执行这个匿名函数
上面代码用的是这种形式( function(){return null;} )(),注意最前面那对括号包括了一个闭包函数function(){return null;},然后最后那个括号代表执行它,分开写就是
var func = function(){return null;};
func();
你的代码里面并不是for()后面又出来了个(),而是那个
(function(){
...
})后面多了对括号,表示执行这个匿名函数
追问
那个我基本上懂了,但是我的代码下面不是还有一个没名字的函数嘛,如下:
function(){
a.scrollLeft=x+Math.round(d*Math.sin(Math.PI*(j+1)/(2*n)));
}
它在setTimeout()里面怎么自动运行了?而当我把它放在setTimeout()外面的时候,它又不自动运行了,why?是不是只要在类似的语句块中定义没有名字的函数,这个函数都能自动运行呀?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没名字的函数是动态自定义浏览器的onload方法,为了实现自己想要的功能,这个方法会在整个页面加载完毕后才会自动执行的方法。
for()后面又有一个()这个应该是错误的吧,应该是一个{符号的,要不你看结尾都是一个}符号,应该是对应的,这个是for语句的嵌套使用。
for()后面又有一个()这个应该是错误的吧,应该是一个{符号的,要不你看结尾都是一个}符号,应该是对应的,这个是for语句的嵌套使用。
追问
没错啊,我就是这截代码看不懂
for(var i=0;i<n;i++)(function()
{
if(time[i])
clearTimeout(time[i]);
var j=i;
time[i]=setTimeout(function(){
a.scrollLeft=x+Math.round(d*Math.sin(Math.PI*(j+1)/(2*n)));
},(i+1)*t);})();
这截代码真的没,我运行了,没错,麻烦你再想想,先谢谢了
追答
仔细看了下,真的是我错了,这种发方法我好像也见过,但具体我不会解释,你就按照这么用吧,没有必要把每个细节都搞懂,只要大方向出不了错就ok了,再说了,这样的方法是很少处理的,因为这种发放写一些特效或者处理麻烦的事情才会用到。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询