关於function声明
关键词:function,javascript,Function javascript,prototype constructor,Function prototype constructor,anonymous,String,new Function
afcn0:
相关文章: X
对于javascript的function的总结
Function
javascript进阶之对象篇
<img src=http://www.javaeye.com/images/icon_more.gif/>
关於function声明还是有些问题,比如
function a(){}
a.prototype.constructor是a自己没错,但是
b=new Function;
b.prototype.constructor是anonymous函数,可是这个函数又是个不存在的东西,并且
c=new Function;
d=new c;
d.constructor还是anonymous,其实就是c但是和c一样还是anonymous函数,这样看来,假如
function a(){}这句就是声明了一个叫a的函数,其它,您再b=a c=a都是给a放了各种外部引用,假如a改变,其它引用都会改变(函数可以在不改变自己指针情况下自己改变吗,不了解,是不是和String自己保护政策,所有方法都不改变自己那样),而假如
c=new Function;其实就是创建了一个anonymous函数,并且这个c只是这个anonymous函数的一个引用,和前面的b,c都是函数a的引用差不多,也就是降级了,就是说function a(){}这个a就是它自己,而c=new Function这个c只是这个函数指针的一个引用,具体还有什麽实际的区别的,为什麽要这样设计呢,不是很明白function声明和new Function之间的区别,难道是闭包什麽的需要这种构造吗,需要这种才能维持函数之间的关系又或是什麽呢
jindw:
javascript:var a = new Function();a==a.prototype.constructor
true
如此,正常。
function a(){} 不等于 var a = function(){}
第一中方式中a不是变量,它是函数名,同时也可以在当前上下文通过这个名字获取函数对象。
a不等价于一个普通的变量,它又有一些局部变量的特征,但还是有些细微的区别。
afcn0:
>>> var a=function(){}
a
function()
var a=function b(){}
a
b()
c=new Function
anonymous()
d=c
anonymous()
d
anonymous()
大概明白了,声明永远是特殊的,声明的东西就好像是一个特殊的指针,function a(){}创建了一个函数a的指针,而a=function(){}是创建了一个函数指针,然后副给了a而a=function b(){}是创建了函数指针b,并且把指针副给了a,而new Function其实就是创建了anonymous的函数指针,然后再副给外部变量,感觉closure就是基于这种指针创建的,也许理解不对,但是其实大部分时间是差不多的,这几种函数创建方法
afcn0:
>>> function a(){alert(123)}
b=a
a()
c=new a
Object
c.constructor==b
true
function a(){}
c.constructor==b
true
c.constructor()
a=new Function("alert(123)")
anonymous()
b=a
anonymous()
c=new a
Object
a=123
123
c.constructor
anonymous()
c.constructor==b
true
其实也证明了function a(){}这个a也不一定就是这个指针的代表,其实可能也就是个引用,假如重新给a副值,并不会导致原来的a对象指针消失,还存在一个声明的function a,这个声明的函数a,很奇怪
function a(){alert(123)}
b=a
a()
c=new a
Object
c.constructor==b
true
function a(){}
c.constructor==b
true
c.constructor()
a=new Function("alert(123)")
anonymous()
b=a
anonymous()
c=new a
Object
a=123
123
c.constructor
anonymous()
c.constructor==b
true
也许声明和new Function唯一的区别就是名字和closure吧
hax:
没有那么复杂。只是一个toString的规定而已。有名函数toString会看到名字。匿名函数toString没有名字(废话,否则怎样叫匿名函数呢)。而new Function产生的一定是匿名函数。函数声明得到的一定是有名函数(废话,否则声明个鸟啊)。而函数表达式可以是有名的也可能是匿名的。通常我们用匿名的,因为JScript丫的不符合标准,可能会造成问题。还有什麽函数指针……JS没有指针,统统是引用。不存在您想像中的那种区别。
killpoer3:
有必要 搞的这么复杂吗? 有可读性吗
HexUzHoNG:
hax 写道没有那么复杂。只是一个toString的规定而已。
有名函数toString会看到名字。匿名函数toString没有名字(废话,否则怎样叫匿名函数呢)。而new Function产生的一定是匿名函数。函数声明得到的一定是有名函数(废话,否则声明个鸟啊)。而函数表达式可以是有名的也可能是匿名的。通常我们用匿名的,因为JScript丫的不符合标准,可能会造成问题。
还有什麽函数指针……JS没有指针,统统是引用。不存在您想像中的那种区别。
hax~ 偶像。
这样的解释简洁明了,一看就明白了。<img src=http://www.javaeye.com/images/smiles/icon_biggrin.gif/>
andot:
new Function 可以通过字符串构造函数体,直接用 function 来定义的话,函数体就不能用字符串来构成了。
afcn0:
楼上说的未必,可曾考虑过eval("function(){"+...+"}")呢,所以说,其实差不多,当然new Function没有scope chain了