小姜哥的微信

JavaScript细微差别(函数声明与函数表达式及浏览器差异)

我将描述一个JavaScript的古怪问题。幸运的是我之前从未在实际工作中出现问题。我确信function a(){}和var a = function (){}是完全相同的的。

其实我错了,两者有很大的不同,看下面的例子。

var a = 5;
if (a == 5) {
var b = function () {
return "obvious";
};
} else {
var b = function () {
return "never";
};
}

if (a == 5) {
function c() {
return "expected";
}
} else {
function c() {
return "surprise!";
}
function d() {
return "how come?";
}
}

alert(b());
alert(c());
alert(d());

你可能说运行结果是“obvious”, “surprise!” and “how come?”,一般来说是正确的,除了Firefox。如果你定义一个命名函数,无论函数定义代码出现在什么位置解析器都会在当前作用域中创建该函数。因此你需要提防这样的代码,同时不要忘记浏览器检测。

另外的一个不同是函数c的name属性值为”c”而b的name属性为””.

c.name == “c”;
b.name == “”;

译者:

本文阐述了函数声明与函数表达式的区别,同时阐述了在不同浏览器中的差别。这个差别之前我就知道,遇到的机会确实不多。

一般来说JavaScript进入到某一作用域时会优先处理函数声明(不包括函数表达式,函数表达式属于声明变量)、形参和变量声明(不包括赋值,所以在正式赋值前变量的值都是undefined)。

所以在函数声明代码之前调用该函数是没有问题的,如果在函数表达式代码之前调用函数表达式所定义的函数是会报错的,因为在调用的时候函数表达式声明的变量值是undefined。

具体在之前的博客你自认为理解了JavaScript?中有所阐述。

如上所述在Firefox中有所不同,输出结果将是“obvious”, “expected”之后报一个没定义的错。看了结果就知道Firefox是怎么做的了。

推荐文章

回到顶部