function C(){
return function(){
alert("警告");
}
}
function test(){
this.A=function(){
var a=C();
setTimeout(a,3000);//这个有弹出“警告”(1)
setTimeout("a()",3000);//这个没有弹出“警告” 报错“a is not defined” (2)
setTimeout("d()",3000);//这个有弹出  问题是“上面的没有弹出,下面的有弹出,都是方法函数啊”
}
}var T=new test();
T.A();
其实最主要的问题是(2)的写法为什么会报错,我习惯(2)的写法。先谢谢大侠,求赐教

解决方案 »

  1.   

    (2)执行的时候scope是的window下,而window下又没有a这个方法。 
    var a=C();
    window.a=C();加这一句,(2)就行了。
      

  2.   

    setTimeout的第一个参数,可以是function也可以是string。当delay过后执行第一个参数的时候,会在window object的上下环境里。如果是function,则该this值为window object;如果为string,则会在全局作用域下评估这个string。第一个对,是因为a传递了一个function的引用,会形成一个闭包,直到这个setTimeout完毕。
    第二个,为string,会在全局环境下评估这个string。而全局环境下没有a这个function,所以会报错。
      

  3.   

    变量作用域的问题,(1) 函数句柄直接赋值给window.setTimeout了,setTimeout能找到
    (2) setTimeout到运行时, a早就不存在了.
    ----------<script>
    function C(){
        return function(){
            alert("警告");
        }
    }
    function test(){
        this.f;
        this.A=function(){
            var a=C();
            this.f = a
            setTimeout("C()()",3000);
            setTimeout("T.f()",3000);
        }
    }
    var T=new test();
    T.A();</script>
      

  4.   

    楼上说的都没错,是上下文环境的问题,(1)是将a的引用传给了setTimeout,所以何时执行都能找到方法入口,(2)在执行时找不到a这个方法(无定义),我纳闷的是d从哪里来的?