zhouyrt 发表于 2013-2-4 19:29:27

具名函数的四种调用方式(2)

以函数中有无this来讨论。没有this时返回一个空的对象{},有this时返回一个非空对象。
 
定义一个没有this的函数
 
//返回值是基本类型function fun() {return "jack";}var c = new fun();for (var atr in c) {alert(atr);} alert(c);// 
返回值c不是"jack", 从for in执行后没有输出任何属性可以看出 c 是一个空的对象{}。
 
再看看有this的函数,函数中有this实际上是在写一个类。但由于js的灵活性,造成了许多诡异的写法。
 
//返回值是基本类型function fun() {this.name = "tom";return "jack";}var c = new fun();for (var atr in c) {alert(atr);//name} alert(c.name);//tom 返回值也不是"jack",for in输出了name属性,最后一句输出了tom,说明返回值 c 是一个非空对象。这里的return "jack"压根没起作用。所以当函数返回值是内置类型(基本类型)时,用new方式调用函数将会导致错误的结果。
 
那么当函数返回值是一个对象,数组,函数呢?
 
//不含this,返回值是一个对象function fun() {//组装一个对象var obj = {};obj.name = 'andy';obj.age = 20;obj.msg = function(){}return obj;}var c = new fun();for (var atr in c) {alert(atr);//name,age,msg} alert(c.name);//andy //含this,返回值是一个对象function fun() {this.sex = "man";//组装一个对象var obj = {};obj.name = 'andy';obj.age = 20;obj.msg = function(){}return obj;}var c = new fun();for (var atr in c) {alert(atr);//name,age,msg} alert(c.name);//andy 
 
两段的输出结果是一样的,c都含有name,age,msg属性而不含sex属性。说明当返回值是对象类型(对象,数组,函数)时,new不会用this去构造对象,而直接返回组装的对象。
 
这种方式实际上是工厂方式,在应用中更多的程序员把函数名首字母大写,让它看起来更像一个类。
 
 
 
 
页: [1]
查看完整版本: 具名函数的四种调用方式(2)