Javascript函数:函数声明、函数表达式、NFE被命名的函数表达式

VitaLemon 2012-08-07

参考:

functions-declarations-and-expressions

在Javascript中,函数象变量一样可以在任何地方被定义。

Javascript中定义函数有如下3种方式:

  • 1,函数声明
  • 2,函数表达式
  • 3,调用newFunction的返回结果

函数声明语法:注意,函数声明的时候,后面不需要跟分号来和其他代码分隔开来。

function Identifier ( FormalParameterListopt ) { FunctionBody }

// 其他的像for循环、if判断的大括号后面,也都没有分号。
for (variable=startvalue;variable<endvalue;variable=variable+increment)
  {
  code to be executed
  }

if (condition)
  {
  code to be executed if condition is true
  }
else
  {
  code to be executed if condition is not true
  }

函数声明的名字在函数内部和函数所在的parent的内部可见!

函数声明在预执行期(即在浏览器准备执行代码的时候、正式执行代码之前)被解析。因此,使用函数声明方式定义的函数,即可以在声明之前调用,也可以在声明之后调用。如下

// 能正常工作
function sayHi(name) {
  alert("Hi, "+name)
}

sayHi("John");

// 也能正常工作
sayHi("John");

function sayHi(name) {
  alert("Hi, "+name)
}

函数可以在代码的任何地方被声明:看如下列子

sayHi();

if (1) {
  function sayHi() {  alert(1)  }
} else {
  function sayHi() {  alert(2)  } // <--
}

试着在不同的浏览器执行上述代码,在FirefoxF14中,执行上述代码无反应。其他浏览器返回2。

这是因为函数声明是在执行前被解析。根据规范(p.10.5),后面的具有相同名字的函数声明覆盖前面已经存在的函数声明。

当到执行期的时候,这些声明代码被忽略。因此if判断其实本身不影响什么东西。

函数表达式语法:

函数在Javascript中是一等公民,象数字、字符串一样。任何你可以放置值的地方,你也可以放置一个函数。

函数表达式就是:任何包含函数function(arguments){...}的表达式。注意:如下表达式声明的最后跟着双引号分隔符。如果在函数表达式中的function也有自己的名字,那么这个名字只在函数内部可见:参考NFE(Namedfunctionexpressions)被命名的函数表达式

函数表达式语法例子1:

var f = function(arguments) {
   ... code ... 
};

函数表达式语法例子2:创建匿名函数、同时执行被创建的匿名函数

为什么函数在方括号里面:因为Javascript只允许函数表达式在这里被执行。

(function() {

  var a, b    // local variables 
 
  // ...      // and the code 

})();

怎么区分:函数声明、函数表达式

当Javascript在主代码流中解析函数时,这是函数声明。否则,当函数作为statement的一部分时,就是函数表达式。

当Javascript的执行流到达时,函数表达式才会被创建。因此,函数表达式只能在声明之后使用。

var sayHi;

// sayHi(); <-- 不能在这里调用sayHi函数,因此此时,sayHi还不存在。

if (1) {
  sayHi = function() {  alert(1)  };
} else {
  sayHi = function() {  alert(2)  };
}

sayHi();

建议:尽量使用函数声明而不是函数表达式。函数表达式只在需要的时候才使用:如使用条件函数定义

  • 1,函数声明可读性更加好,代码更加简短
  • 2,函数声明能在声明之前被调用

函数声明和函数表达式都是定义一个变量,然后把一个函数放进去。不同的是他们的创建时间:函数声明在预执行期,函数表达式在执行期。

第三种定义函数的方式:使用newFunction,如下,很少使用这种方式。

var sayHi = new Function('name', ' alert("Hi, "+name) ');

sayHi("Benedict");

NFE(Namedfunctionexpressions)被命名的函数表达式:如下的函数表达式,就包含自己的名字

var f = function sayHi(name) {
  alert("Hi, "+name)
};

上面的语法就被叫做NFE(被命名的函数表达式)。在支持这种语法的浏览器中,function声明的名字只在函数内部可见。如下:Firefox14中,sayHi1的名字在函数外面调用不到!IE8可以!

var f = function sayHi(name) {
  alert(sayHi);
};
f(1);
sayHi(1);

NFE一般被用在递归调用的地方。

相关推荐