JavaScript-What'匿名函数和普通代码之间的区别是什么

JavaScript - What's the difference between an anonymous function and just regular code?

本文关键字:代码 之间 是什么 区别 函数 JavaScript-What      更新时间:2023-12-29

我想知道这两者之间有什么区别:

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

这个:

alert('Hi');

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

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

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

此:

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

得到与以下相同的输出:

alert('Hi');

有人能告诉我有什么不同吗?

主要区别在于它有自己的作用域。示例:

(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"

您的示例显示了一个自执行的匿名函数。自执行函数关闭作用域,因此您可以执行以下操作:

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);

做同样的事情。

当您声明一个没有名称的函数时,即

function(){
  ...
}

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

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

顺便说一句,这是一个关于JS中模式的好资源:http://addyosmani.com/resources/essentialjsdesignpatterns/book/