aa.apply(this);  用apply来执行,那么aa函数里的this自然指向a对象。
this.timer = setTimeout(arguments.callee,1000) 执行到这里的时候为什么会去执行this._doPrev = function () {return _this.doPrev.apply(_this)}; 这句话呢?
setTimeout执行以后this为什么会指向window?
<html>
<head>
<style type="text/css">
*{margin:0;padding:0;}
.list{width:1050px;height:100px;overflow:hidden;position:relative;}
.ul{position:absolute;top:0;left:0;}
.ul li{width:100px;height:100px;background:orange;float:left;margin-right:5px;}
</style>
</head> <body>
<div id="left">left</div>
<div class="list" id="list">
<ul class="ul" id="ul">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
<li>11</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</ul>
</div>
<div id="right">right</div>
<script type="text/javascript">
//var $ = function(id){return typeof id === "string"?document.getElementById(id):id};
var obj = {
create : function(){
return function(){
this.initialize.apply(this,arguments);
}
}
}
var a = obj.create();
a.prototype = {
initialize: function(left,right){
var _this = this;
this.wrap = function $(id){return typeof id === "string" ? document.getElementById(id) : id};
this.left = this.wrap(left);
this.right = this.wrap(right);
this.index = 0;
this.timer = null;
this._doPrev = function () {return _this.doPrev.apply(_this)};
this._doNext = function () {return _this.doNext.apply(_this)};
this.addEvent(this.left, "click", this._doPrev);
this.li = this.wrap("ul").getElementsByTagName("li");
this.w = this.li.length * (this.li[0].offsetWidth+5);
this.ulW = function(){
this.wrap("ul").style.width = this.w+"px";
}
},
addEvent:function(elem,type,func){
return elem.addEventListener ? elem.addEventListener(type,func,false):elem.attachEvent("on"+type,func)
},
doPrev : function(){
this.index++;
var left =this.wrap("ul").offsetLeft;
console.log(this instanceof  a)
var aa = (function (){
console.log(this instanceof  a)
if(left >  ("-"+this.wrap("list").offsetWidth) * this.index){
this.wrap("ul").style.left = ("-"+this.wrap("list").offsetWidth) * this.index + "px";
this.timer = setTimeout(arguments.callee,1000)
}else{
clearTimeout(this.timer);
}
})
aa.apply(this);

}

}
var obj = new a("left","right");
obj.ulW()
//aa.initialize()


</script>
</body>
</html>

解决方案 »

  1.   

    setTimeout是异步执行的,不会阻塞主线程,所以程序依然会继续执行this.timer = setTimeout(arguments.callee,1000) //这儿arguments.callee方法传递给setTimeout函数后由setTimeout时间到达时的回调函数调用,不再由arguments调用,所以里面this指向window
      

  2.   

    setTimeout的问题你理解异步执行就明白了,就是setTimeout另外开了一个线程来等待延时,主线程继续执行简单举个类似例子说明下this的指向
    function test()
    {
      alert(this);//这儿this一定是window么?
    }
    var obj={};
    obj.test=test;
    test();//弹出window
    obj.test();//弹出objvar test2=obj.test;
    test2();//把obj.test赋值给test2,调用时貌似应该与obj.test()时相同,但实际上弹出window,你的问题与这个类似
      

  3.   

    setTimeout 里面函数的作用域就是windows!