这种函数在javascript中意味着什么?

jma*_*mat 3 javascript syntax function

在下面,我对语法感到困惑

(function (h,j) { })
Run Code Online (Sandbox Code Playgroud)

在javascript中有一个函数坐在里面()是什么意思?

function myfunc(c, b) {
    try {
            (function (h, j) {
                //do a bunch of stuff
            })
    } catch (e) {
        myerror(e)
    }
};
Run Code Online (Sandbox Code Playgroud)

har*_*rto 15

就其本身而言,这样的函数声明是无用的.这种声明只有在您实际调用函数时才有用,如下所示:

(function (h, j) { ... } (x, y));
Run Code Online (Sandbox Code Playgroud)

这通常用于隐藏变量,因为JavaScript只有函数作用域(没有块作用域).

编辑:

一些例子 - 希望这些不会混淆事物......

正如评论中所提到的,此技术对于将变量保持在全局范围之外非常有用.例如,某些初始化脚本可能会执行以下操作:

(function () {
    var x = 42;
    var y = 'foo';

    function doInitialisation(a, b) {
        // ...
    }

    doInitialisation(x, y);
}());
Run Code Online (Sandbox Code Playgroud)

在函数完成后没有x,y或者doInitialisation是可见的.

另一个用例是避免循环中的闭包.例如,以下是一个众所周知的问题:

var links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
    links[i].onclick = function () {
        alert(i);
    };
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,每个onclick处理程序共享相同的值i.功能范围可以避免这个:

var links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
    links[i].onclick = (function (x) {
        return function() {
            alert(x);
        }
    }(i));
}
Run Code Online (Sandbox Code Playgroud)