JavaScript/jQuery 中括号中的代码块是啥意思? [复制]

Posted

技术标签:

【中文标题】JavaScript/jQuery 中括号中的代码块是啥意思? [复制]【英文标题】:What does a block of code in parentheses mean in JavaScript/jQuery? [duplicate]JavaScript/jQuery 中括号中的代码块是什么意思? [复制] 【发布时间】:2011-06-05 01:13:54 【问题描述】:

可能重复: What does (function($) )(jQuery); mean?

我见过很多具有以下语法的 jQuery 代码,但我并不真正理解它的含义。它出现在this answer 和this answer 关于代码组织的问题上。两者都谈到了命名空间,所以我猜这就是它的作用。

var foo = (function () 
    var someVar;

    function someFunc() 
        return true;
    
)();

这是用于命名空间的吗?它是如何工作的?有时在最后一组括号中有一个名称(命名空间?),有时没有。两者有什么区别?

【问题讨论】:

还有***.com/questions/4531110/… 这不是完全重复的,因为它询问的是更一般的情况,而不是特定的 jQuery 情况——这是一个类似的情况。 @Orbling 是的,但是这两个问题的答案都不是 jquery 特有的。 @Nikita Rybak:没错,但我相信我们会关闭重复问题的问题,而不是因为可以在不同的标题下找到有效的答案。 是的,就个人而言,当我发现有重复答案的问题时,我会在下面的“答案”部分发布指向该答案的链接,而不是投票关闭。重复的答案与重复的问题不同。问题应该仍然存在,以便可以搜索。 【参考方案1】:

包装函数的() 将匿名函数声明转换为函数表达式,然后可以使用表达式后面的() 立即调用该表达式。

在这种情况下,外部的() 真的没有必要,因为var foo = 会将它变成一个表达式。此外,foo 的值将是 undefined,因为函数调用不会返回任何内容。

它可用于创建新的变量范围,因为函数是在 javascript 中实现该功能的唯一方法。 (Javascript 没有块作用域。)

所以someVar 变量不能被外部作用域访问。有时可能希望以受控方式访问它。为此,您可以将引用someVar 的函数传递到该范围之外。然后在函数调用退出后,它的执行上下文将保持不变,并且someVar 将以您传递的函数提供的任何方式可用。

这称为创建closure

假设您将一个值传递给调用,并将其分配给someVar。然后,您可以在对 foo 变量的调用中使用 return 一个函数。如果你返回的那个函数引用了someVar,那么你可以使用那个函数来获取它的值。

var foo = (function ( str ) 
    var someVar = str;
/*
    function someFunc() 
        return true;
    
*/
    return function() 
        alert( someVar );
    ;
)( 'somevalue' );

foo(); // alerts 'somevalue'

如您所见,foo 现在引用的函数仍然可以访问someVar

假设您更改了它,以便返回到foo 的函数可以接受一个参数,这将更新myVar 的值。

var foo = (function ( str ) 
    var someVar = str;
/*
    function someFunc() 
        return true;
    
*/
    return function( n ) 
        if( n ) 
            someVar = n;
         else 
            alert( someVar );
        
    ;
)( 'somevalue' );

foo(); // alerts 'somevalue'

foo( 'newvalue' ); // give it a new value

foo(); // alerts 'newvalue'

现在您可以看到,foo 中的函数确实访问了该变量,因为它能够更改其值,并引用它之前设置的新值。

【讨论】:

【参考方案2】:

括号将匿名函数包裹起来,使其成为可以通过在其后添加参数直接调用的变量。

(function(param) 
    // do stuff
)(param);

最后的位不是命名空间,只是一个参数。你可能已经看到这个用于 jQuery 的:

(function($) 
    $('.something').addClass('.other');
)(jQuery);

这样做是将 jQuery 对象传递给函数,使 $ 变量成为匿名函数范围内的 jQuery 对象。人们喜欢使用简写$,但它会导致与其他库的冲突。此技术通过将完全限定的jQuery 对象传入并覆盖该函数范围内的$ 变量来消除冲突的可能性,因此可以使用快捷方式。

【讨论】:

以上是关于JavaScript/jQuery 中括号中的代码块是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript -JQuery 中否定“if”语句块中的代码,例如“if not then ..”

使用 JavaScript/jQuery 重定向到 ASP.NET MVC 中的另一个页面

Javascript/jQuery - 使用正则表达式解析字符串中的主题标签,URL 中的锚点除外

无法从 asp.net MVC 中的视图运行 JavaScript

如何使用 jquery/javascript 将文本插入 json [重复]

做啥 ?和:在javascript中的意思[重复]