函数声明:一种独立的结构。
eg:function fn(){ /*do something*/ }
函数表达式:函数定义为表达式语句(通常是变量赋值)的一部分。
eg:var a = function fn(){ /*do something*/ }
-
区别
- 对于函数声明,js解析器会优先读取,确保在所有代码执行之前已经被解析
- 对于函数表达式,只在执行到某一句时也会对其进行解析
实例
- 下面一段代码返回2
function foo(){
function bar() {
return 1;
}
return bar();
function bar() {
return 2;
}
}
alert(foo());
- 吃惊脸!!!return 语句后面的代码是运行不到的啊……
-
解析:
执行 JavaScript 过程中,有 Context(ECMA 5 将之分解为 LexicalEnvironment、VariableEnvironment 和 ThisBinding)和 Process(一系列按序调用的语句)两个概念。当程序进入执行域时,Declaration 会造成 VariableEnvironment。它们不同于 Statement(比如 return),也不遵循 Statement 的运行规则。 - 下面一段代码返回1
function foo(){
var bar = function() {
return 1;
};
return bar();
var bar = function() {
return 2;
};
}
alert(foo());
-
解析:
执行到return返回了,没后面什么事了
关于自执行
- 函数 声明的自执行
(function fn(){
alert(1);
})();
- 函数表达式的自执行
var a = function aaa(){alert(2)}();
~function aaa(){
alert(3);
}();