【问题标题】:What does this type of function mean in javascript?这种类型的函数在javascript中意味着什么?
【发布时间】:2010-07-09 04:00:12
【问题描述】:

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

(function (h,j) { })

在 javascript 中,像这样位于 () 中的函数是什么意思?

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

【问题讨论】:

  • 这段代码似乎没有做任何事情。你确定这就是全部吗?
  • (function (h,j) { }) 什么都不做。 (function (h,j) { })(arg1,arg2) 创建并执行一个匿名函数。请注意,区别在于第一部分后面的括号 - 就像说 alertalert() 一样,一个提到一个函数,另一个执行它。
  • 你可能想看看这个问题:stackoverflow.com/questions/2539205/…
  • 我喜欢这个结构。它让我想起了魔术或忍者闪光弹手里剑动作。
  • 还有更多,我只是从一些代码中撕下来做一个例子..但我认为这里和下面的每个人都明白我在说什么......谢谢。

标签: javascript function syntax


【解决方案1】:

就其本身而言,这样的函数声明是没有用的。这种声明只有在实际调用函数时才有用,方法如下:

(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));
}

【讨论】:

  • 补充一点:Javascript 中没有其他块包围语法实际上限制了范围。在函数体内声明的变量通常被注入到全局命名空间中,can cause problems.
  • 我正在查看一个脚本并从中提取代码,我也经常看到这种情况:(function (h, j) { //a bundle of foo })(function() { //more foo }) 在这种情况下,我假设第二个函数实际上是调用第一个函数并传递它 h 和 j?
  • 这看起来像第二个函数作为参数传递给第一个函数...相当混乱。
【解决方案2】:

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

所以当

> 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) {}

但是,您的示例中的用法似乎没有用。它什么都不做。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 是的,但它没有回答为什么这个匿名函数用括号括起来的问题。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-23
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      相关资源
      最近更新 更多