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") 会造成这么奇怪的变化呢?
这个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();
因为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();//不可用都报了好几个错误了,都影响执行了
如果需要给对象的实例添加属性(方法),需要写成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()这个方法了,所以会出错
Fun():如果这么调 函数体中的this指代window
new Fun() :如果这么调 函数体中的this指代当前对象