下面一个有趣的javascript: 复制代码 代码如下: function f() { console.log("I am outside!"); } (function () { if(false) { // 重复声明一次函数f function f() { console.log("I am inside!"); } } f(); }());
会输出什么呢?第一反应应该是"I am outside"吧. 结果在chrome中输出"I am inside",IE11直接报错,firefox低一点的版本输出"I am outside"... chrome输出的结果很明确的反应了用函数声明式声明的函数的特点--函数在声明之前就可以调用. IE报错显示缺少对象,因为函数声明在了条件里,违背了函数声明式的原则. 函数表达式的作用域: 如果函数表达式声明的函数有函数名,那么这个函数名就相当于这个函数的一个局部变量,只能在函数内部调用,举个栗子: 复制代码 代码如下: var f = function fact(x) { if (x <= 1) return 1; else return x*fact(x-1); }; alert(fact()); // Uncaught ReferenceError: fact is not defined