我们从一些小测试开始。以下情况都会弹出什么结果?
题 1:
1 2 3 4 5 6 7 8 9 10 |
function foo(){ function bar() { return 3; } return bar(); function bar() { return 8; } } alert(foo()); |
题 2:
1 2 3 4 5 6 7 8 9 10 |
function foo(){ var bar = function() { return 3; }; return bar(); var bar = function() { return 8; }; } alert(foo()); |
题 3:
1 2 3 4 5 6 7 8 9 10 |
alert(foo()); function foo(){ var bar = function() { return 3; }; return bar(); var bar = function() { return 8; }; } |
题 4:
1 2 3 4 5 6 7 8 9 10 |
function foo(){ return bar(); var bar = function() { return 3; }; var bar = function() { return 8; }; } alert(foo()); |
如果你的答案不是8、3、3和 [Type Error: bar is not a function] 的话,就继续往下读吧……(即使答对了也要继续读哦)
什么是 Function Declaration(函数声明)?
Function Declaration 可以定义命名的函数变量,而无需给变量赋值。Function Declaration 是一种独立的结构,不能嵌套在非功能模块中。可以将它类比为 Variable Declaration(变量声明)。就像 Variable Declaration 必须以“var”开头一样,Function Declaration 必须以“function”开头。
e.g.
1 2 3 |
function bar() { return 3; } |
ECMA 5(13.0)定义语法:
function Identifier ( FormalParameterList[opt] ) { FunctionBody }
函数名在自身作用域和父作用域内是可获取的(否则就取不到函数了)。
1 2 3 4 5 6 |
function bar() { return 3; } bar() //3 bar //function |
什么是 Function Expression(函数表达式)?
Function Expression 将函数定义为表达式语句(通常是变量赋值)的一部分。通过 Function Expression 定义的函数可以是命名的,也可以是匿名的。Function Expression 不能以“function”开头(下面自调用的例子要用括号将其括起来)。
e.g.