JavaScript 习惯用法:创建一个函数只是为了调用它
Posted
技术标签:
【中文标题】JavaScript 习惯用法:创建一个函数只是为了调用它【英文标题】:JavaScript idiom: create a function only to invoke it 【发布时间】:2010-10-16 11:03:23 【问题描述】:我在学习YUI,偶尔看到这个成语:
<script>
(function x() do abcxyz)();
</script>
为什么他们创建一个函数只是为了调用它? 为什么不直接写:
<script>
do abcxyz
</script>
例如查看here。
【问题讨论】:
另见:***.com/questions/631187/javascript-scope-and-closure 【参考方案1】:他们正在利用closures。
一个简短的解释:由于 JS 使用函数级别的作用域,你可以在一个函数内做一堆动作并让它保持在那个作用域内。这对于调用不会与全局命名空间混淆的代码很有用。它还允许创建私有变量 - 如果您在匿名函数内部声明一个变量并立即执行它,那么只有匿名函数内部的其他代码可以访问该变量。
例如,假设我想创建一个全局唯一 id 生成器。有人可能会做这样的代码:
var counter = 0;
var genId = function()
counter = counter + 1;
return counter;
但是,现在任何人都可以弄乱 counter,而我现在已经用两个变量(counter 和 genId)污染了全局命名空间.
相反,我可以使用匿名函数来生成我的计数器函数:
var genId = function()
var counter = 0;
var genIdImpl = function()
counter = counter + 1;
return counter;
return genIdImpl;
();
现在,我在全局命名空间中只有一个变量,这是有利的。更重要的是,counter 变量现在可以安全地被修改——它只存在于匿名函数的作用域中,因此只有函数 genIdImpl(在同一作用域中定义)可以访问它。
看起来在 YUI 的示例代码中,他们只是想执行完全不污染全局命名空间的代码。
【讨论】:
【参考方案2】:我猜他们想避免命名空间冲突。似乎是 JS 中的一个好习惯。
【讨论】:
以上是关于JavaScript 习惯用法:创建一个函数只是为了调用它的主要内容,如果未能解决你的问题,请参考以下文章