锁定老帖子 主题:函数申明和变量申明的微妙区别
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-21
dlee 写道 to Readonly:
与执行顺序无关。 症状是:只要创建了一个名称为xxx的普通变量,再以最初一楼代码中的那种方式创建名称为xxx的函数就是无效的(并没有创建这个函数),无论将这个函数声明放在哪里。只能通过用匿名函数明确地为xxx变量赋值,才可能绕过这个问题。 这个症状在IE和Firefox中是一致的。 解释就是他们都遵循ecma规范,把函数声明置前,所以被后面的变量声明覆盖了。而匿名函数不是函数声明而是函数表达式,只在执行时才会创建该function对象。 |
|
返回顶楼 | |
发表时间:2007-05-21
晕,该贴的第四页几乎被hax一头牛给包了^_^
|
|
返回顶楼 | |
发表时间:2007-05-21
dlee 写道 可能就是因为这个原因,在很多的Ajax组件库中都采用了使用匿名函数赋值的方法,因为这样做不容易被覆盖。
另外像Dojo这样的库都将全部的函数都放在某个名字空间变量中,例如: dojo.byId或者dojo.io.bind, 虽然有很多Prototype Fans认为$函数才是最方便优雅的写法,但是dojo.byId用起来会更安全一些,因为开发者定义一个变量名称为dojo.byId是不可能的(变量名中不能出现“.”)。 dojo.byId为什么更安全?其实也不安全,因为dojo这个变量也会被覆盖。只是概率比$小一些罢了。 根本上的解决需要jsi或pies这样的框架。 |
|
返回顶楼 | |
发表时间:2007-05-21
hax 写道 dlee 写道 是的,这就是上面我最后补充的一句话的情况:
引用 当然,如果在外部的代码中包含有函数调用,其调用的这个函数是会在调用之前创建的。 你之前的描述是错误的(就ecma规范而言,实际引擎怎么实现,偶们都不清楚)。 根据ecma-262规范edition 3,函数声明(注意var x = function () {}是函数表达式,不是函数声明)会被放到函数体或者代码块的最前端。所以不管外部代码有没有函数调用,都是先创建函数声明所声明的函数(靠,绕口令了)。 我咋没找到呢,记得在那里吗? 我去学习学习。 |
|
返回顶楼 | |
发表时间:2007-05-21
andot 写道 这两种有差别,
var a = funciton() {}; 是定义一个变量a,定义一个匿名函数,然后将匿名函数赋值给变量a。 而 function a(){} 只是声明一个名字为a的函数。 function a(){} 比 var a = funciton() {}; 执行效率高一点点。但是 var a = funciton() {}; 这种方式更灵活一些。 到目前为之,没有任何理论理由或者实际的测试表明函数声明比函数表达式效率高“一点点”。 |
|
返回顶楼 | |
发表时间:2007-05-21
jindw 写道 hax 写道 dlee 写道 是的,这就是上面我最后补充的一句话的情况:
引用 当然,如果在外部的代码中包含有函数调用,其调用的这个函数是会在调用之前创建的。 你之前的描述是错误的(就ecma规范而言,实际引擎怎么实现,偶们都不清楚)。 根据ecma-262规范edition 3,函数声明(注意var x = function () {}是函数表达式,不是函数声明)会被放到函数体或者代码块的最前端。所以不管外部代码有没有函数调用,都是先创建函数声明所声明的函数(靠,绕口令了)。 我咋没找到呢,记得在那里吗? 我去学习学习。 忘记了。整个ecma规范就是诘屈聱牙,看的人很不爽。找不到也是非常正常的。。。。 我估计在什么execution context之类的章节里。。。 |
|
返回顶楼 | |
发表时间:2007-05-21
很需要这样的牛在关键点上给我们解解惑啊!
|
|
返回顶楼 | |
发表时间:2007-05-22
这个其实很简单,看看这篇文章就知道了:http://www.coolcode.cn/andot/javascript-oop-inheritance-polymorphism/255
|
|
返回顶楼 | |