澳门皇冠金沙网站-澳门皇冠844网站

热门关键词: 澳门皇冠金沙网站,澳门皇冠844网站

函数声明与函数表达式的区别介绍澳门皇冠844网

还是一样,先上代码:

在ECMAScript中,创建函数的最常用的两个方法是函数表达式和函数声明,因为ECMA规范只明确了一点:函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符:

复制代码 代码如下:

  函数声明:

<script>
var f = function g() {
return 1;
};
if (false) {
f = function g(){
return 2;
};
}
alert(g()); // 2
</script>

  function 函数名称 (参数:可选澳门皇冠844网站,){ 函数体 }

把这段代码扔到IE 6 里面和chorme里面是完全不同的两种效果。

  函数表达式:

这里输出2 是在ie6里面的效果,如果在chorme会出现g没有定义。

  function 函数名称(可选)(参数:可选){ 函数体 }

这也算是JScript的bug吧。

所以,可以看出,如果不声明函数名称,它肯定是表达式,可如果声明了函数名称的话,如何判断是函数声明还是函数表达式呢?ECMAScript是通过上下文来区分的,如果function foo(){}是作为赋值表达式的一部分的话,那它就是一个函数表达式,如果function foo(){}被包含在一个函数体内,或者位于程序的最顶部的话,那它就是一个函数声明。

在这里很明显,这里的只是定义了g的函数表达式而已。包括在if的条件语句中,也只是定义了函数表达式,没有去声明函数。

function foo(){} // 声明,因为它是程序的一部分
var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分
new function bar(){}; // 表达式,因为它是new表达式
(function(){
   function bar(){} // 声明,因为它是函数体的一部分
})();

那么这样直接访问肯定是会出错的。

还有一种函数表达式不太常见,就是被括号括住的(function foo(){}),他是表达式的原因是因为括号 ()是一个分组操作符,它的内部只能包含表达式

本文由澳门皇冠金沙网站发布于前端开发,转载请注明出处:函数声明与函数表达式的区别介绍澳门皇冠844网