javascript - 一段简短却让人看得蒙逼的JS代码?
怪我咯
怪我咯 2017-04-11 10:13:08
0
4
300

分析公司页面的时候遇到的
作用:在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(){}())呢?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(4)
迷茫

分开你能明白,合起来就不明白了?

这样是可以的(函数声明):

function C() {
...
}

var c = new C();

这样也是对的(函数表达式):

var C = function() {
...
}

var c = new C();

省略中间变量当然也没问题:

var c = new function() {
...
};

这种形式跟上面的没有本质区别。

至于arguments.callee,是在函数调用时,函数内部的变量arguments上的一个属性。

那么函数调用有哪些方式?

  • 直接调用:f(...)obj.f(...)

  • 通过new关键字调用

  • 通过applycall等方法调用

new是用来创建对象的不错,但是它同时也是一种调用函数的方式啊,所以此时在函数内部的arguments.callee当然是有效的,并且指向函数对象本身。

PHPzhong

相当于
var _fun = argument.callee;
setTimeout(_fun,1500);

不同于var _f = function(){};
var只是一个声明,function内部的代码只有在_f()的时候才会被执行。
new则是实例化了一个对象,会调用function(){}内的构造函数,function(){}内部的代码会立刻被执行。

Ty80

new function : 创建函数并执行
arguments : 正在执行的函数实例
arguments.callee: 返回的是函数对象本身

刘奇

已经差不多弄清楚工作机制,请见
https://github.com/YueminHu/Vertical-Scroll/blob/master/experi2
完整代码如下

<html>
 <head>
 <style>
p.outer{
    margin:100px auto;
    height: 20px;
    width: 200px;
    outline: 1px solid black;
    overflow: hidden;
}
p{
    margin: 0;
    padding: 0;
    line-height: 20px;
}
 </style>
 <!-- <script src="js/layer-v2.2/layer/Layer.js"></script> -->
 </head>
 <body>
<p class="outer" id="investShow">
    <p class="inner">111</p>
    <p class="inner">112</p>
    <p class="inner">113</p>
    <p class="inner">114</p>
    <p class="inner">115</p>

    <p class="inner">116</p>

    <p class="inner">117</p>

</p>

<script>
var box=document.getElementById("investShow"),autoScroll=true;
box.onmouseover=function(){autoScroll=false};
box.onmouseout=function(){autoScroll=true};
new function (){
 var stop=box.scrollTop%20==0&&!autoScroll;//只有当【scrollTop为20的整数倍】和【autoScroll为false】这两个条件同时满足时,stop才会被触发
 if(!stop)box.scrollTop==parseInt(box.scrollHeight)-20?box.scrollTop=0:box.scrollTop++;//如果box已经滚动到顶部,则归位(scrollTop=0);否则scrollTop递增
 setTimeout(arguments.callee,box.scrollTop%20?10:150);//调用自身,如果scrollTop为20整倍数(对应内容正好显示在中间),则停顿150ms;否则每隔10ms调用一次(scrollTop递增)
};
</script>
 </body>
 </html>
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!