12

我发现了这个疯狂的 javascript 代码。

有人可以详细说明这段代码正在经历的确切步骤吗?为什么?

(function a(a){
    return a;
})
(function b(b){
    return b;
})
(function c(c){
    return c;
})
(true);
4

6 回答 6

10
  • 这将自我调用a,它function b作为参数给出(因为a被定义为本地范围内的变量a,它将取代在父范围中声明的函数。)。 a
  • 然后它将自我调用,作为参数b给出。c
  • finally 函数c是自调用的,它true作为参数返回。

您可以将其视为执行此操作的链:

a(var a)    // function b given as arg. When a returns b() will be invoked
   b(var b) // function c given as arg. When b returns c() will be invoked
      c(true)

awhen 在函数内部(局部范围)是一个变量,因为function foo(bar){}function(){var bar = arguments[0]}.

该函数a可以这样编写并执行相同的操作:

function a(foo){
    return foo;
}

您可以通过执行以下操作进行验证:

console.log('start');

(function a(a){
    console.log('a', typeof a);
    return a;
})
(function b(b){
    console.log('b', typeof b);
    return b;
})
(function c(c){
    console.log('c', typeof c);
    return c;
})
(true);

console.log('end');

在线小提琴在这里

控制台输出(更新为在 FF 中显示以及使用 Chrome 查看函数定义输出):

> start
> a function
> b function
> c boolean
> end
于 2013-09-05T05:18:36.247 回答
4

要了解发生了什么,请简化它:

(function a(d){
    return 5*d;
})
(2)

上面的代码在控制台中运行,将输出10. 发生的事情是括号告诉代码立即运行(它称为自调用函数),将后面的任何内容作为参数。所以我正在创建function a,并立即将其2作为参数运行。

你拥有的代码基本上是一样的,但是有更多的级别,没有乘法。您所有的函数都只返回它们的参数,并且传递的是 boolean true,因此代码将true在最后输出。

于 2013-09-05T05:13:21.553 回答
2

这返回true

第一个function a(坏名?)被定义,它接受一个参数并返回它。该函数已被立即调用,其参数为(function b(b){ return b; })(function c(c){ return c; })(true). a在调用之前对其进行评估。

(function b(b){ return b; })(function c(c){ return c; })(true)是一个类似的构造,b定义了一个函数,该函数返回它接收到的参数,并再次使用类似的参数立即调用,并且对于第三个函数也是如此c

于 2013-09-05T05:07:23.777 回答
1
(function a(a){
            alert(a);
        return a;
    })
    (function b(b){
        alert(b);
        return b;
    })
    (function c(c){
        alert(c);
        return c;
    })
    (true);

它只是用 () 符号返回参数的下一部分。

于 2013-09-05T05:17:33.023 回答
1

我会试一试。

(function a(a){
  return a;
})
(function b(b){
 return b;
})
(function c(c){
return c;
})
(true);

这些都是自调用函数。

但是最后一个:

    (function c(c){
      return c;
    })
    (true);

获取传入的值 true。因此,当它返回“c”时 - 你得到 true。

对于其他人,它只是随着匿名函数在函数返回的值中传递而向上移动。所以,一个视觉。

   (function a(a){   <-- the return of b, gets passed in here
      return a;
    })(function b(b){return b;}) <-- the return of c, gets passed in here

    (function c(c){return c;})(true);  <--- true gets passed into c.
于 2013-09-05T05:20:41.403 回答
1

函数按自上而下的顺序执行。您可以使用另一个函数作为其参数来调用一个函数。这可以。它一直这样做,直到“true”作为参数传递,在这种情况下,调用链返回“true”。

(function a(a){       // Function a is called with function b as an argument.
    console.log('a'); // The console.log statement is executed,
    return a;         // Then function a returns b 
})                    

(function b(b){       // Function b is called with function c as an argument.
    console.log('b')  // The console.log statement is executed
    return b;         // And then function b returns c 
})

(function c(c){       // Function c is called with "true" as an argument
    console.log('c')  // The console.log statement is executed
    return c;         // And then function c returns true.
})

(true); 
于 2013-09-05T05:06:43.273 回答