我想知道这之间的区别是什么:
(function(msg) {
alert(msg);
}('Hi'));
和此:
alert('Hi');
因为当你使用匿名函数时,你不能运行两次,对吧?你不能这样做:
(function(msg) {
alert(msg);
}('Hi')('Goodbye'));
那么匿名函数有什么意义呢?
此:
(function(msg) {
alert(msg);
}('Hi'));
获得与此相同的输出:
alert('Hi');
有人能告诉我有什么区别吗?
答案 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/