具名函数和匿名函数

废话不说,先上代码

  • 具名函数
var a = 2;
function foo() {
var a = 3;
console.log( a ); //3
} 
foo(); 
console.log( a ); // 2

虽然这种技术可以解决一些问题,但是它并不理想,因为会导致一些额外的问题。首先,
必须声明一个具名函数 foo() ,意味着 foo 这个名称本身“污染”了所在作用域(在这个例子中是全局作用域)。其次,必须显式地通过函数名( foo() )调用这个函数才能运行其中的代码。如果函数不需要函数名(或者至少函数名可以不污染所在作用域),并且能够自动运行,
这将会更加理想。

  • 匿名函数
var a = 2;
( function foo(){ 
var a = 3;
console.log( a ); // 3
})(); 
console.log( a );

函数会被当作函数表达式而不是一个标准的函数声明来处理。
function如果出现在声明中第一个词的位置,就是函数声明
函数表达式意味着函数被直接绑定在作用域中,意味着foo只能再被自己代表的位置被调用,不会污染全局作用域
匿名函数的缺点在于

  • 忽略了代码可读性
  • 在栈追踪中不会显示有意义的函数名,造成调试困难
  • 因为没有函数名,所以函数在调用自己时,必须使用过期的argument.callee
    解决方案
    行内函数表达式,比如计时器函数
setTimeout( function timeoutHandler() { // <-- 快看,我有名字了!
console.log( "I waited 1 second!" );
}, 1000 );

猜你喜欢

转载自blog.csdn.net/Efficiency9/article/details/74012351
今日推荐