今天又见到这段在IE浏览器地址栏运行的、有趣的JS代码如下:
javascript: var R=0;var x1=.1;var y1=.05;var x2=.25;var y2=.24;var x3=1.6;var y3=.24;var x4=300;var y4=200;var x5=300;var y5=200;var DI=document.images;var DIL=DI.length; function A(){for(var i=0; i-DIL; i++){var DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5;}R++;}setInterval('A()',5);void(0);
即:
javascript: var R=0;var x1=.1;var y1=.05;var x2=.25;var y2=.24;var x3=1.6;var y3=.24;var x4=300;var y4=200;var x5=300;var y5=200;var DI=document.images;var DIL=DI.length; function A(){for(var i=0; i-DIL; i++){var DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5;}R++;}setInterval('A()',5);void(0);
突然想到这里为什么要用运行函数void(0);呢?
把void(0)去掉后,页面刷新,上面显示了一个数字,可void(0)的的确确没什么可执行的效果,但是却能保证页面不刷新,这又是为什么呢?
网上查了一下,这篇文章(https://blog.csdn.net/nosodeep/article/details/8547490)讲得比较详细,原文有一段讲到了原因,摘取下来:
“......在IE的地址栏中输入 javascript:<代码>,即可在当前页面上直接执行指定的代码并立即看到效果。而且,<代码>中可以包含多条语句,甚至可以包含 if/for 等流程控制语句。
代码一般有两种写法:
javascript:<表达式>
该写法将会执行表达式,并将表达式的结果在当前页面内显示。javascript:<函数>
该表达式将会执行指定的函数,而当前页面的显示不会受到影响。那么IE如何区分地址栏中输入的代码到底是函数还是表达式?其实很简单,代码的最后一条语句以参数列表 () 结束,则作为函数处理,不更新页面显示;代码的最后一条语句不以 () 结束,则作为表达式处理,在当前页面内显示表达式的计算结果。
......”
不过看前面的实例,实例以setInterval('A()',5);结尾,应该被解析为函数,按照文中逻辑,不应该刷新页面,但是实验结果是:浏览器根本不管这一套,直接刷新页面出现一个数字——那么问题来了:这个数字是哪里来的呢?
如果按照文中所述,那么代码:
javascript:var a=1;alert();
应该不刷新页面,只出现对话框,而代码:
javascript:alert();var a=1;
经实验,二者都不刷新页面!
本来嘛,alert()只是弹出一个对话框,var a=1仅仅是定义一个全局变量罢了;
不过,不小心试了一下这个 ,却扎扎实实刷新页面,出现了一个“3”:
javascript:alert(); a=3;
呵呵,是不是很打脸?
在JavaScript中,好像是高级编程中吧,记得讲过,“var a”是定义一个变量,而直接使用一个未定义的变量,如“a=9;”那么这个“a”就会被定义在dom树上,成为dom上的一个节点,可能它代表这段代码返回值为3吧。
因此本文开头那段代码去掉“void(0)”后出现的数字,应该是setInterval()函数的返回值。
对此,做如下实验:把setInterval()函数封装一下,变成B()函数:
javascript: var R=0;var x1=.1;var y1=.05;var x2=.25;var y2=.24;var x3=1.6;var y3=.24;var x4=300;var y4=200;var x5=300;var y5=200;var DI=document.images;var DIL=DI.length; function A(){for(var i=0; i-DIL; i++){var DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5;}R++;}function B(){setInterval('A()',5);return 3; }B();
B()函数有返回值时,仍然会导致页面刷新,显示一个“3”。如果把B()函数的返回值去掉,即,去掉return语句,则实现了“void(0)”的效果,页面没有刷新。所以问题找到了,就是最后这个函数不能有返回值!当然,对于有返回值的函数,也可以把它的返回值作为一个变量存下来,管它有没有用,不过记得:是变量,不是dom上的节点,也就是说得用var修饰!
javascript: var R=0;var x1=.1;var y1=.05;var x2=.25;var y2=.24;var x3=1.6;var y3=.24;var x4=300;var y4=200;var x5=300;var y5=200;var DI=document.images;var DIL=DI.length; function A(){for(var i=0; i-DIL; i++){var DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5;}R++;}var B=setInterval('A()',5);
javascript: var R=0;var x1=.1;var y1=.05;var x2=.25;var y2=.24;var x3=1.6;var y3=.24;var x4=300;var y4=200;var x5=300;var y5=200;var DI=document.images;var DIL=DI.length; function A(){for(var i=0; i-DIL; i++){var DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5;}R++;}var B=setInterval('A()',5);
这样一切就好理解了,不是吗?
个人见解,欢迎拍砖!