分析公司页面的时候遇到的
作用:在p内部循环上下滚动p,每个p条目显示1500ms(根据代码猜的)。当鼠标悬停时停止滚动。
HTML结构如下
<p style="height:20px; overflow:hidden" id="p2">
<p>汉堡</p>//p的高度也为20px
<p>番茄酱</p>
<p>薯条</p>
<p>And Cheese</p>//实际代码的p内部共有6个p标签
</p>
JS代码如下
<script language="javascript">
var box=document.getElementById("p2"),can=true;
box.innerHTML+=box.innerHTML;
box.onmouseover=function(){can=false};//改变flag
box.onmouseout=function(){can=true};
new function (){
var stop=box.scrollTop%18==0&&!can;
if(!stop)box.scrollTop==parseInt(box.scrollHeight/2)?box.scrollTop=0:box.scrollTop++;
setTimeout(arguments.callee,box.scrollTop%20?10:1500);
};
</script>
new是用function创建新对象的关键字,那直接new function又是什么意思?在这个function内部无参数地调用arguments.callee还能调用到函数本身吗?此外还有很多看不懂的地方,求解!
new function是不是相当于(function(){}())呢?
分开你能明白,合起来就不明白了?
这样是可以的(函数声明):
这样也是对的(函数表达式):
省略中间变量当然也没问题:
这种形式跟上面的没有本质区别。
至于
arguments.callee
,是在函数调用时,函数内部的变量arguments
上的一个属性。那么函数调用有哪些方式?
直接调用:
f(...)
或obj.f(...)
通过
new
关键字调用通过
apply
和call
等方法调用new
是用来创建对象的不错,但是它同时也是一种调用函数的方式啊,所以此时在函数内部的arguments.callee
当然是有效的,并且指向函数对象本身。相当于
var _fun = argument.callee;
setTimeout(_fun,1500);
不同于
var _f = function(){};
var只是一个声明,function内部的代码只有在_f()的时候才会被执行。
new则是实例化了一个对象,会调用function(){}内的构造函数,function(){}内部的代码会立刻被执行。
new function : 创建函数并执行
arguments : 正在执行的函数实例
arguments.callee: 返回的是函数对象本身
已经差不多弄清楚工作机制,请见
https://github.com/YueminHu/Vertical-Scroll/blob/master/experi2
完整代码如下