FireFox中JS引擎对函数声明式的解析与其他浏览器的差异
在FireFox和FireBug中的一个Bug这篇文章中,偶然发现了FireFox下的函数声明问题,一直没有得到权威的资料来解决。11月26日面试新浪微博的时候,面试官也问到了这个问题,当然他没看我的BLOG,并从他口中得知,这个不是BUG,而是FF的Monkey引擎就是这样解析的,当然我的回答是:“个人推测,在FF下对语句快内的函数声明转化为函数表达式”。 面试官说不是,当然也没给出具体答案,提示我说MDN有这方面的资料。
如果懒得看前面的文章的话,可以看看下面一个简单的例子,在FF/IE/Chrome都跑一遍,看看FF和其他二者之间的差异:(FF会报错,其他的会弹出函数代码)
view plain
if(0){
function a(){}
}
alert(a);
当天晚上,我去找了找MDN,还真被我找到了,从资料上看,和我的推测是一致的,就是例子也和我前面提到的文章也类似。具体链接如下:
https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope#Function_constructor_vs._function_declaration_vs._function_expression
英文水平不是特别好,这里贴下重点部分和例子,并稍微翻译下(强烈建议看原文,我的翻译太蹩脚了):
函数声明式非常容易(并且常常出乎意料)转化为函数表达式。一个函数声明要么转化为一个表达式的部分,要么不再是一个函数或脚本本身的"source element"。"source element" 是脚本中或一个函数体内的非嵌套语句。
给出的例子如下:
var x = 0; // source element
if (x == 0) { // source element
x = 10; // not a source element
function boo() {} // not a source element
}
function foo() { // source element
var y = 20; // source element
function bar() {} // source element
while (y == 10) { // source element
function blah() {} // not a source element
y++; // not a source element
}
}
Examples:
// function declaration
function foo() {}
// function expression
(function bar() {})
// function expression
x = function hello() {}
if (x) {
// function expression
function world() {}
}
// function declaration
function a() {
// function declaration
function b() {}
if (0) {
// function expression
function c() {}
}
}
条件定义一个函数
函数可以用//函数语句//(一个ECMA-262 第3版允许的扩展)或者Function构造函数条件的定义。
在下面的脚本中,zero函数绝不会被定义并且不能够被触发,因为'if (0)'将它的条件判断为false:
if (0) {
function zero() {
document.writeln("This is zero.");
}
相关新闻>>
- 发表评论
-
- 最新评论 更多>>