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,而我现在已经用两个变量(countergenId)污染了全局命名空间.

相反,我可以使用匿名函数来生成我的计数器函数:

var genId = function()

    var counter = 0;
    var genIdImpl = function()
    
        counter = counter + 1;
        return counter;
    

    return genIdImpl;
();

现在,我在全局命名空间中只有一个变量,这是有利的。更重要的是,counter 变量现在可以安全地被修改——它只存在于匿名函数的作用域中,因此只有函数 genIdImpl(在同一作用域中定义)可以访问它。

看起来在 YUI 的示例代码中,他们只是想执行完全不污染全局命名空间的代码。

【讨论】:

【参考方案2】:

我猜他们想避免命名空间冲突。似乎是 JS 中的一个好习惯。

【讨论】:

以上是关于JavaScript 习惯用法:创建一个函数只是为了调用它的主要内容,如果未能解决你的问题,请参考以下文章

Javascript·常见错误及用法习惯(新手入门)

将函数放入 javascript 对象中是一种好习惯吗? [复制]

JavaScript学习手册(18)

js (JavaScript)函数声明的几种形式及用法

javascript编程习惯总结

javascript中$含义及用法