【发布时间】:2011-03-01 18:40:20
【问题描述】:
我对下面的 Javascript 语法不是很熟悉。任何人都可以为这个街区的感觉遮遮掩掩吗?目的是什么?
(函数 foo() { 警报(“酒吧”); })();提前致谢。
【问题讨论】:
-
他的问题与那些不同,因为他在闭包函数上有一个名字,从而产生了一组完全不同的问题(尽管,他可能有意也可能无意)
标签: javascript
我对下面的 Javascript 语法不是很熟悉。任何人都可以为这个街区的感觉遮遮掩掩吗?目的是什么?
(函数 foo() { 警报(“酒吧”); })();提前致谢。
【问题讨论】:
标签: javascript
var tokenizer = (function(){ 变量 ID = 0; 返回函数(){ 返回 id++; }; })();
tokenizer(); // 0
tokenizer(); // 1
tokenizer(); // 2
alert(id); // undefined
【讨论】:
这对我来说似乎是一种不好的做法(命名闭包函数),因为它会导致浏览器不一致。
以下面的代码为例
(function foo() {
alert('bar');
})();
foo();
在 Internet Explorer 中,您将收到 2 个警报,因为它实际上将函数创建为名为 foo 的全局函数。
在 Chrome 中,它只会提醒一次,并且 foo 没有全局声明,所以你会收到一个 javascript 错误 foo is not defined
通常你不会给闭包函数命名
(function() { // notice you don't see foo anymore
alert('bar');
})();
【讨论】:
目的是使您的工作范围超出全球范围。这有助于封装您的对象并防止它们污染全局池。除了在函数 foo() 中声明的函数之外,您对包含函数 foo() 全局声明的任何变量都将不可用
var GLOBALVAR //this is available to the global document scope
(function foo() {
var FOOVAR //only available within this function
function bar(){
FOOVAR = GLOBALVAR //this will work
}
alert('bar');
})();
FOOVAR = GLOBALVAR //This will not because FOOVAR is out of scope
【讨论】:
Javascript 允许您动态声明函数——它们被称为闭包——并且在你的示例中在第一组括号之间完成。当您引入第二组括号时,您正在调用您刚刚定义的那个函数。需要注意的区别是函数声明/定义和该函数的应用之间的区别。
【讨论】: