このクレイジーな JavaScript コードを見つけました。
誰かがこのコードが通過する正確な手順とその理由を詳しく説明できますか?
(function a(a){
return a;
})
(function b(b){
return b;
})
(function c(c){
return c;
})
(true);
このクレイジーな JavaScript コードを見つけました。
誰かがこのコードが通過する正確な手順とその理由を詳しく説明できますか?
(function a(a){
return a;
})
(function b(b){
return b;
})
(function c(c){
return c;
})
(true);
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
何が起こっているのかを理解するために、単純化します。
(function a(d){
return 5*d;
})
(2)
上記のコードをコンソールで実行すると、 が出力されます10
。起こっていることは、括弧がコードをすぐに実行するように指示していることです (これは自己呼び出し関数と呼ばれます)。だから私は作成function a
していて、すぐにそれを2
パラメータとして実行しています。
あなたが持っているコードは基本的に同じものですが、より多くのレベルがあり、乗算はありません。すべての関数はパラメーターを返すだけで、渡されるのは booleantrue
であるため、コードはtrue
最後に出力されます。
これは を返します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
。
関数は上から順に実行されます。別の関数を引数として関数を呼び出すことができます。これで問題ありません。「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);
(function a(a){
alert(a);
return a;
})
(function b(b){
alert(b);
return b;
})
(function c(c){
alert(c);
return c;
})
(true);
() 記号でパラメーターの次の部分を返すだけです。
刺してみます。
(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.