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

时间:2010-07-09 04:00:12

标签: javascript function syntax

在下面,我对语法

感到困惑
(function (h,j) { })

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

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

4 个答案:

答案 0 :(得分:15)

这样的函数声明本身就没用了。这种声明仅在您实际调用函数时才有用,如下所示:

(function (h, j) { ... } (x, y));

通常这样做是为了隐藏变量,因为JavaScript只有函数作用域(没有块作用域)。

编辑:

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

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

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

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

    doInitialisation(x, y);
}());

在功能完成后,xydoInitialisation都不可见。

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

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

在上面的示例中,每个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));
}

答案 1 :(得分:4)

()是一个分组运算符,它返回计算其中表达式的结果。

所以,而

> function(x,y) {}
SyntaxError: Unexpected token (

本身就是SyntaxError,但是通过用括号括起来,括号内的表达式会被评估并返回。

> (function(x,y) {})
function (x,y) {}

函数表达式和声明不会产生任何值,因此我们得到undefined

功能声明

> function a(x,y) {}
undefined

功能声明(带分组操作符)

(function a(x,y) {})
function a(x,y) {}

功能表达

> var x = function(x,y) {}
undefined

函数表达式(使用分组运算符)

> var x;
> (x = function(x,y) {})
function (x,y) {}

但是,您示例中的用法似乎毫无用处。它什么都不做。

答案 2 :(得分:1)

这种语法就是所谓的Anonymous Function。大多数情况下,您会看到它们用作各种其他函数调用的回调(例如,在jQuery中)。

答案 3 :(得分:1)

这是一种内联函数,因此您可以利用协方差的优势。我的意思是,在里面

(function(h,j){             //做一堆东西         }) 您可以访问包含函数的变量,这里是function myfunc(c, b) {}