2
!function() { return false; } ()

あなたがこのようなことを書く理由はわかっていますが、それがどのように機能するかについて質問があります。私が理解しているように、感嘆符は次の 2 つのことを行います。

  1. に作用しfunction() { return false; }、式に変えます
  2. また、実行された関数の結果にも作用するため、行全体が次のように評価されます。true

だから私の質問は:

  1. これは正しい説明ですか?
  2. それが正しければ、()は よりも強く結合するため!、最初の部分 (関数自体を式に変更すること) はどのように行われたのでしょうか? 感嘆符が行全体に作用しないのはなぜですか?
4

2 に答える 2

4

演算子の優先順位に従って、function宣言(の省略形new Function)が最初に発生し、関数呼び出し()が2番目に発生し、否定!が最後に発生します。

明確にするために編集:同じことを達成するために、その1行を次のように書き直すことができます。

// declare an anonymous function and assign it to the myFunc variable
var myFunc = function () { 
    return false; 
};

// execute the function and store it's return value (false) in returnValue
var returnValue = myFunc();

// negate the return value (true)
var output = !returnValue;
于 2012-05-23T15:01:33.130 に答える
1

1)「変更」しません。パーサーが「関数」ビットを通過すると、式が期待されるため、「関数」は関数ステートメントとしてではなく、(おそらく匿名の) 関数式の一部として解析されます。

2)ライン全体に作用しているjbabey で提案されているように、優先順位を見ると、関数呼び出しが否定演算子よりも厳密にバインドされていることがわかります。

! ((function(){})());

または、同様の、おそらくより読みやすいバージョンで:

var f = function(){ ... };
! (f());
于 2012-05-23T15:15:49.597 に答える