function Fun(arg)
{
alert(arg);
this.aFun = function() { alert("a"); }
var  bFun = function() { alert("b"); }
aFun();
bFun();
}

Fun("xxx");
var fff = new Fun("yyy");
fff.aFun();
fff.bFun(); // 这一句浏览器没有输出,为什么?先后输出 7 个框,分别是: xxx    a    b    yyy    a    b    a
function Fun(arg)
{
alert(arg);
this.aFun = function() { alert("a"); }
var  bFun = function() { alert("b"); }
aFun();
bFun();
}

//Fun("xxx"); // 注释掉了,然后
var fff = new Fun("yyy");
fff.aFun();
fff.bFun();只输出一个框,既: yyy   
为什么我注释掉 Fun("xxx") 会造成这么奇怪的变化呢?

解决方案 »

  1.   

        fff.bFun(); // 这一句浏览器没有输出,为什么?
    这个b.fun不能在外部访问,那不是对象的属性
        function Fun(arg)
        {
            alert(arg);
            this.aFun = function() { alert("a"); }
            var  bFun = function() { alert("b"); }
            aFun();//执行到这句出错了,  你这是在调用window对象中的aFun函数
            bFun();
        }
        
        //Fun("xxx"); // 注释掉了,然后
        var fff = new Fun("yyy");
        fff.aFun();
        fff.bFun();
      

  2.   

    fff.bFun(); // 这一句浏览器没有输出,为什么?
    因为var  bFun = function() { alert("b"); }中的bFun不是对象的属性(只有用this前缀的才是)
    function Fun(arg)
    {
    alert(arg);//应该输出yyy
    this.aFun = function() { alert("a"); }
    var  bFun = function() { alert("b"); }
    // aFun();//注意this.aFun是对象Fun的属性方法,而aFun啥也不是
    bFun();//因为是var声明的,所以并不是对象Fun的属性,所以如此可以
    }//Fun("xxx"); // 注释掉了,然后
    var fff = new Fun("yyy");
    fff.aFun();//可以
    //fff.bFun();//不可用都报了好几个错误了,都影响执行了
      

  3.   

    第一个问题中的  var  bFun = function() { alert("b"); }相当于.net中的private 私有类型,只能在类中进行访问,外部无法通过构造函数调用.. 第二个问题为什么只输出"YYY" : var fff = new Fun("yyy");构造函数的声明使得Fun()函数里面的this都指向了fff, 所以fff.aFun()可以执行 ,但是bFun为Fun()函数的私有类型,所以报错找不到....
      

  4.   

    fff.bFun(); // 这一句浏览器没有输出,为什么?
    如果需要给对象的实例添加属性(方法),需要写成function Fun(arg){this.bFun = function(){...}},否则只是函数内的一个变量,不能成为实例的属性。var fff = new Fun("yyy");
    这一句会依次执行:
    alert("yyy");
    fff.aFun() = function() { alert("a"); }
    var  bFun = function() { alert("b"); }
    aFun();
    aFun()并不是window的方法。如果你没有注释掉Fun("xxx"),在Fun("xxx")执行的时候, this.aFun = function() { alert("a"); } 的效果相当于window.aFun = function() { alert("a"); }。
    现在你把Fun("xxx")注释掉后,不能为window添加aFun()这个方法了,所以会出错
     
      

  5.   

    其实就是一个Fun() 和new Fun()的问题
    Fun():如果这么调   函数体中的this指代window
    new Fun() :如果这么调  函数体中的this指代当前对象