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")}赋给一个变量 即用函数表达式的表示方式。

posted @ 2011-11-15 19:31  十年半山  阅读(137)  评论(0)    收藏  举报