JavaScript - 匿名函数和常规代码之间的区别是什么?

时间:2013-11-29 22:13:01

标签: javascript anonymous-function

我想知道这之间的区别是什么:

(function(msg) {
    alert(msg);
}('Hi'));

和此:

alert('Hi');

因为当你使用匿名函数时,你不能运行两次,对吧?你不能这样做:

(function(msg) {
    alert(msg);
}('Hi')('Goodbye'));

那么匿名函数有什么意义呢?

此:

(function(msg) {
    alert(msg);
}('Hi'));

获得与此相同的输出:

alert('Hi');

有人能告诉我有什么区别吗?

3 个答案:

答案 0 :(得分:3)

主要区别在于它有自己的范围。例如:

(function(msg) {
  var x = msg; // local variable in the scope
  alert(x);
}('Hi'));

// the variable x doesn't exist out here

当你在范围中创建一个函数并将其暴露在外面时,这很有用。即使在外部执行,该函数仍可访问范围。这样,函数可以保持状态,而不会全局暴露状态:

var f = (function(msg) {
  var cnt = 1;
  return function(){
    alert(msg + ' ' + cnt);
    cnt++;
  };
}('Hi'));

f(); // shows "Hi 1"
f(); // shows "Hi 2"

答案 1 :(得分:2)

您的示例显示了一个自动执行的匿名函数。自执行功能会关闭范围,因此您可以执行以下操作:

var count = (function(){
  var c = 0;
  return function(){
    return c++;
  }
})();
console.log(count()); console.log(count());

在你的第一个例子中,不会发生任何不同。一个匿名函数,没有名字,所以这个:

document.getElementById('whatever').addEventListener('click', function(){alert('wow')});

function wow(){
  alert('wow');
}
document.getElementById('whatever').addEventListener('click', wow);

做同样的事情。

答案 2 :(得分:1)

匿名函数是在声明一个没有名称的函数时,即

function(){
  ...
}

你的例子是一个中级函数,在这里你可以隐藏属性和功能(使用闭包,这很复杂我建议你 JS Ninja的秘密,但是是一本中级lvl书。)所以你可以在使用模块模式时使用它:

(function(msg) {
    alert(msg);
}('Hi'));

BTW这是关于JS中模式的一个很好的资源:http://addyosmani.com/resources/essentialjsdesignpatterns/book/