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
  • 最後に、関数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)

a関数内 (ローカル スコープ) が変数の場合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パラメータとして実行しています。

あなたが持っているコードは基本的に同じものですが、より多くのレベルがあり、乗算はありません。すべての関数はパラメーターを返すだけで、渡されるのは booleantrueであるため、コードは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受け取った引数を返す関数が定義されており、同様の引数ですぐに呼び出され、3 番目の関数についても同じですc

于 2013-09-05T05:07:23.777 に答える
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 に答える
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 に答える