参考:
[url=http://javascript.info/tutorial/functions-declarations-and-expressions]functions-declarations-and-expressions[/url]
在Javascript中,[color=red]函数象变量一样可以在任何地方被定义[/color]。
Javascript中定义函数有如下3种方式:
[list]
[*]1,函数声明
[*]2,函数表达式
[*]3,调用new Function的返回结果
[/list]
[b]函数声明语法:[/b][color=red]注意,函数声明的时候,后面不需要跟分号来和其他代码分隔开来。[/color]
函数声明的名字在函数内部和函数所在的parent的内部可见!
函数声明在[color=red]预执行期(即在浏览器准备执行代码的时候、正式执行代码之前)被解析[/color]。因此,使用函数声明方式定义的函数,即可以在声明之前调用,也可以在声明之后调用。如下
[b]函数可以在代码的任何地方被声明:[/b]看如下列子
试着在不同的浏览器执行上述代码,在FirefoxF14中,执行上述代码无反应。其他浏览器返回2。
这是因为函数声明是在执行前被解析。[color=red]根据规范(p.10.5),后面的具有相同名字的函数声明 覆盖前面已经存在的函数声明。[/color]
[color=red]当到执行期的时候,这些声明代码被忽略。[/color]因此if判断其实本身不影响什么东西。
[b]函数表达式语法:[/b]
函数在Javascript中是[b]一等公民[/b],象数字、字符串一样。任何你可以放置值的地方,你也可以放置一个函数。
[b]函数表达式就是:[/b]任何包含函数function(arguments) { ... }的表达式。注意:[color=red]如下表达式声明的最后跟着双引号分隔符。[/color][color=red][b]如果在函数表达式中的function也有自己的名字,那么这个名字只在函数内部可见:参考NFE(Named function expressions)被命名的函数表达式[/b][/color]
[b]函数表达式语法例子1:[/b]
[b]函数表达式语法例子2:[/b][color=red]创建匿名函数、同时执行被创建的匿名函数[/color]
为什么函数在方括号里面:因为Javascript只允许函数表达式在这里被执行。
[b]怎么区分:[/b]函数声明、函数表达式
当Javascript在[color=red]主代码流中解析函数[/color]时,这是函数声明。否则,当函数作为statement的一部分时,就是函数表达式。
[color=red]当Javascript的执行流到达时,函数表达式才会被创建。因此,函数表达式只能在声明之后使用。[/color]
建议:尽量使用函数声明而不是函数表达式。函数表达式只在需要的时候才使用:如使用条件函数定义
[list]
[*]1,函数声明可读性更加好,代码更加简短
[*]2,函数声明能在声明之前被调用
[/list]
函数声明和函数表达式都是定义一个变量,然后把一个函数放进去。不同的是他们的创建时间:[color=red]函数声明在预执行期,函数表达式在执行期[/color]。
[b]第三种定义函数的方式:[/b]使用new Function,如下,很少使用这种方式。
[b]NFE(Named function expressions)被命名的函数表达式[/b]:如下的函数表达式,就包含自己的名字
上面的语法就被叫做NFE(被命名的函数表达式)。在支持这种语法的浏览器中,[color=red]function声明的名字只在函数内部可见[/color]。如下:Firefox14中,sayHi1的名字在函数外面调用不到!IE8可以!
NFE一般被用在递归调用的地方。
[url=http://javascript.info/tutorial/functions-declarations-and-expressions]functions-declarations-and-expressions[/url]
在Javascript中,[color=red]函数象变量一样可以在任何地方被定义[/color]。
Javascript中定义函数有如下3种方式:
[list]
[*]1,函数声明
[*]2,函数表达式
[*]3,调用new Function的返回结果
[/list]
[b]函数声明语法:[/b][color=red]注意,函数声明的时候,后面不需要跟分号来和其他代码分隔开来。[/color]
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的内部可见!
函数声明在[color=red]预执行期(即在浏览器准备执行代码的时候、正式执行代码之前)被解析[/color]。因此,使用函数声明方式定义的函数,即可以在声明之前调用,也可以在声明之后调用。如下
// 能正常工作
function sayHi(name) {
alert("Hi, "+name)
}
sayHi("John");
// 也能正常工作
sayHi("John");
function sayHi(name) {
alert("Hi, "+name)
}
[b]函数可以在代码的任何地方被声明:[/b]看如下列子
sayHi();
if (1) {
function sayHi() { alert(1) }
} else {
function sayHi() { alert(2) } // <--
}
试着在不同的浏览器执行上述代码,在FirefoxF14中,执行上述代码无反应。其他浏览器返回2。
这是因为函数声明是在执行前被解析。[color=red]根据规范(p.10.5),后面的具有相同名字的函数声明 覆盖前面已经存在的函数声明。[/color]
[color=red]当到执行期的时候,这些声明代码被忽略。[/color]因此if判断其实本身不影响什么东西。
[b]函数表达式语法:[/b]
函数在Javascript中是[b]一等公民[/b],象数字、字符串一样。任何你可以放置值的地方,你也可以放置一个函数。
[b]函数表达式就是:[/b]任何包含函数function(arguments) { ... }的表达式。注意:[color=red]如下表达式声明的最后跟着双引号分隔符。[/color][color=red][b]如果在函数表达式中的function也有自己的名字,那么这个名字只在函数内部可见:参考NFE(Named function expressions)被命名的函数表达式[/b][/color]
[b]函数表达式语法例子1:[/b]
var f = function(arguments) {
... code ...
};
[b]函数表达式语法例子2:[/b][color=red]创建匿名函数、同时执行被创建的匿名函数[/color]
为什么函数在方括号里面:因为Javascript只允许函数表达式在这里被执行。
(function() {
var a, b // local variables
// ... // and the code
})();
[b]怎么区分:[/b]函数声明、函数表达式
当Javascript在[color=red]主代码流中解析函数[/color]时,这是函数声明。否则,当函数作为statement的一部分时,就是函数表达式。
[color=red]当Javascript的执行流到达时,函数表达式才会被创建。因此,函数表达式只能在声明之后使用。[/color]
var sayHi;
// sayHi(); <-- 不能在这里调用sayHi函数,因此此时,sayHi还不存在。
if (1) {
sayHi = function() { alert(1) };
} else {
sayHi = function() { alert(2) };
}
sayHi();
建议:尽量使用函数声明而不是函数表达式。函数表达式只在需要的时候才使用:如使用条件函数定义
[list]
[*]1,函数声明可读性更加好,代码更加简短
[*]2,函数声明能在声明之前被调用
[/list]
函数声明和函数表达式都是定义一个变量,然后把一个函数放进去。不同的是他们的创建时间:[color=red]函数声明在预执行期,函数表达式在执行期[/color]。
[b]第三种定义函数的方式:[/b]使用new Function,如下,很少使用这种方式。
var sayHi = new Function('name', ' alert("Hi, "+name) ');
sayHi("Benedict");
[b]NFE(Named function expressions)被命名的函数表达式[/b]:如下的函数表达式,就包含自己的名字
var f = function sayHi(name) {
alert("Hi, "+name)
};
上面的语法就被叫做NFE(被命名的函数表达式)。在支持这种语法的浏览器中,[color=red]function声明的名字只在函数内部可见[/color]。如下:Firefox14中,sayHi1的名字在函数外面调用不到!IE8可以!
var f = function sayHi(name) {
alert(sayHi);
};
f(1);
sayHi(1);
NFE一般被用在递归调用的地方。