关于表达式 和 声明
首先要区分表达式和声明
function fn() { alert(""); }
这玩意儿 就是 声明
var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分 new function bar(){}; // 表达式,因为它是new表达式
具体的区别可以参考这里
为什么要分他的区别呢?
js的解析器对函数声明与函数表达式并不是一视同仁地对待的。
对于函数声明,js解析器会优先读取,确保在所有代码执行之前声明已经被解析,
而函数表达式,如同定义其它基本类型的变量一样,只在执行到某一句时也会对其进行解析.
例子:
alert(fn()); function fn() { return 'Hello world!'; }
弹出了 Hello World
alert(fn()); new function fn() { return 'Hello world!'; }
报错
名字的作用域
var a = function b() { alert(typeof a); alert(typeof b); }
a(); alert(typeof a); alert(typeof b);
结果是
function
function
function
undefined
b 在function 外面 不能被识别的。
但是。 微软的JScript 却能识别。
在IE8 下的结果
function
function
function
function
PS: IE9,10 xp 表示无力。
当然 在JScirpt 中 各种恶心。
var f; if (false) { f = function g() { alert("a"); }; } g();
你能想象 这样的代码也能运行吗=。=
对的 在IE8下 真弹出来了
也就是这样说。 在IE6,7,8下 即便的false 的情况下 也会创建声明函数。
当然在JScsript g也被当做函数声明。
if (false) { function g() { alert("a"); }; } g();
所以这样的代码在IE下也是允许的.
所以 这种写法 免了吧