Javascript函数:函数声明、函数表达式、NFE被命名的函数表达式
参考:
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一般被用在递归调用的地方。