javascript的 函数声明 和函数表达式
今天再看一篇BLOG的时候,发现那篇文章一直在说函数声明和函数表达式,
弄得我有点晕了,后来整理了一下。其实这两个概念以前早就用过,只不过是没有注意到它们的名字而已!
1。函数声明
function a()
{
alert("hello world")
}//这就是一个函数声明
函数表达式:
var a=function()
{
alert("hello world")
}//这就是一个函数表达式
2.下面是一些看起来很怪异的函数
~function a(){
alert(1111);
}();
+function a(){
alert(1111);
}();
但是当你把~ +去掉后他们又会报一个SyntaxError的错误。这是因为从语法解析的角度看,Javascript不允许在函数声明的后面直接使用小括号,而函数表达式则没有这个限制,通过在函数声明前面加上一个"~“,"+","-","!"操作符,就可以让语法解析器把后面看成是函数表达式。其实上面的函数可以这样写。
var a=function()
{
alert(1111);
}();
但是这样又会出现一个问题,因为你定义了一个变量,它会污染当前的运行环境,从而带来潜在的危险。
但是如果你不喜欢在前面加上"~“,"+","-","!"操作符,可以按下面这样写,其实这也是很多js库常用的方式。
(function a(){
alert(1111);
})();
相信看过prototype、jquery等库的朋友肯定见到过这种写法。
3.在一篇js的blog上看到了另一个关于函数声明和函数表达式的区别。
首先看一下下面一段代码
if(false)
{
var a=1;
function a()
{
alert("test");
}
alert(a);
}
当你在不同浏览器执行的时候会发现一个有趣的问题
在chrom和IE中你会得到函数a的函数代码,但是在ff下却会得到undefined。
这是为什么呢?其实这是因为firefox对函数声明式解析和其他浏览器差异的原因,
firefox引擎会将在语句体里面的function a(){alert("test")}当做语句来处理,而其他浏览器却会把它
当做一个函数声明,从而不管if 是真是假 都会将函数a定义。这样一来就会出现上面的一些问题。
在mdn上推荐将在语句体里面的function a(){alert("test")}赋给一个变量 即用函数表达式的表示方式。

浙公网安备 33010602011771号