浅谈创建函数的两种⽅式
我们知道,创建函数有两种⽅式:
1、函数声明
2、函数表达式
下⾯就针对这两种⽅式说说⾃⼰的看法。函数prototype
⾸先,我们创建⽰例:
//声明式
function zhao(){}
//表达式
var wede=function(){};
貌似看见过有⼈使⽤函数表达式⽅式创建对象来使⽤,⽐如⼀般情况下是这样写:
var obj={};
但有⼈却是这样写的:
var wede=function(){};
⾸先针对这两种写法我们来做⼀个最简单的⽐较:
String.call(obj); //"[object Object]"
String.call(wede); //"[object Function]"
得出的结论就是,他们的类型不同。前者是Object类型;后者是Function类型。
虽然是不同的类型,但他们却都能使⽤相同的⽅式添加成员,如:
obj.fname="wede";
wede.fname="wede";
结果:
obj.fname; //"wede"
wede.fname; //"wede"
实际上,从原型链的继承关系来看,函数的原型继承于Object,也许这就是其中的奥秘吧。
但是,因为他们是不同的类型,同样的属性还是有区别的:
obj.fname; //这⾥的fname属性是属于对象的
wede.fname; //⽽这⾥的fname属性是属于函数的
这⾥也许会有⼀个疑问:既然函数表达式可以⽤.添加成员,那函数声明⽅式能不能这样做呢?
下⾯我们就来说说函数声明式。
⽏庸置疑,它也是Function类型的。
String.call(zhao); //"[object Function]"
我们可以像上⾯那样添加成员:
zhao.fname="wede";
zhao.fname; //"wede"
⽽且这样也不会有任何问题,同样这时的fname属性也是属于函数的。
之所以上⾯要强调fname属于函数,除了和上⾯的属于对象的属性相区别,还有⼀个重要原因。
我们知道,以函数声明⽅式创建的函数可以是普通函数,也可以是构造函数。
两者的区别仅仅是有⽊有this的区别(当然说函数⾸字母⼤⼩写也包括,不过这只是书写规范)。
为了说明this在函数中的作⽤,来看下⾯的代码:
function F(){this.kname="kkk"}
function F(){kname="kkk"} //注意,这⾥没有使⽤this
我们知道,构造函数中this定义的成员是属于实例的;⽽我们如果省略了this,那结果会是什么呢?
也许我们已经猜到了,属于全局对象window(不过这也得等到函数执⾏了以后才会有)。证明如下:(function F(){kname="kkk"})();
kname; //"kkk"
这会让我们⼜想到了var关键字。
是的,在函数内部⽤var来声明局部变量,这样⽆论是对实例还是全局对象都将是不可见的了。
如:function F(){var kname="kkk"}
现在的kname就完全是⼀个局部成员了。
哎,讨论了半天⼜回到了原点。。。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论