2

私はこのコードに出くわしましたが、ブロック内のコードが自動実行関数のように親にラップされている理由がわかりません。

function foo(a,b) {
  var b = b || window,
    a = a.replace(/^\s*<!(?:\[CDATA\[|\-\-)/, "/*$0*/"); 
  if (a && /\S/.test(a)) {
    (b.execScript || function (a) {
      b["eval"].call(b, a)
    })(a);
  }
}

最初のパラメーターは、スクリプトタグからのテキストです。私が得られない唯一の部分は、スクリプトevalが括弧で囲まれている理由です。

4

6 に答える 6

5

私はあなたがこの部分について話していると思います:

(b.execScript || function (a) {
    b["eval"].call(b, a)
})(a);

これは短い形式の記述です。

if (b.execScript) {
    b.execScript(a);
}
else {
    b["eval"].call(b, a);
}

b.execScriptつまり、定義されている場合は実行し、そうでない場合はを呼び出しますb["eval"].call(b, a)

グループ化演算子の目的は... || ...、関数呼び出しの前に評価することです。つまり、グループ化演算子の結果が何であれ、それは関数として扱われ、それに渡さaれて呼び出されます。

コードを次のように簡略化できるようです

(b.execScript || b["eval"])(a);

明示的にに設定thisするb必要がある場合でも、1つの引数のみを受け入れる2つの関数を使用するには、関数式も必要aです。

于 2013-03-11T15:06:17.003 に答える
4
(b.execScript || function (a) {
      b["eval"].call(b, a)
    })(a)

||引数が渡される前に実行する関数を決定するためにステートメントを評価する必要があるため、これは括弧で囲まれています。

このコードは、存在し、真実である場合b.execScript、引数を使用して呼び出します。それ以外の場合は、新しい関数を定義し、その関数への引数として渡します。ab.execScripta

パレンスラップは||、関数が実行される前にステートメントが評価されることを確認することです。これがないと、ロジックは基本的に実行されます。b.execが存在しない場合は、カスタム関数の値に評価されます。存在する場合は、b.execに評価されます。

したがって、parensを使用すると、ロジックは次のようになります。

if(b.execScript){
   b.execScript(a)
}
else{
  function (a) {
    b["eval"].call(b, a)
  })(a)

}

それがなければ、

if(!b.execScript){function(a){b ["eval"]。call(b、a)})(a)}

于 2013-03-11T15:06:15.397 に答える
3

||演算子は関数呼び出し演算子よりも緩くバインドされるため、括弧で囲まれています()。括弧がない場合、式は次のように記述されているかのように評価されます。

b.execScript || (function (a) { b["eval"].call(b, a); })(a)

つまり、b.execScriptその関数を呼び出すことの単純な値または値のいずれかになります。著者が望んでいたのは、b.execScript(おそらく関数である)の値またはその小さな無名関数のいずれかを呼び出すことでした。

于 2013-03-11T15:06:11.623 に答える
2

(a)その後のため。表現:

(b.execScript || function (a) {
      b["eval"].call(b, a)
    })

クロージャを返します。これはa、パラメータとして渡された状態で実行されます。

于 2013-03-11T15:05:57.350 に答える
0

括弧で囲まれた式は、b.execScriptの結果または新しい関数のいずれかを返します。いずれの場合も、結果はパラメータとしてaを使用して呼び出されます。両親は通訳が||を評価することを確認します 呼び出しの前。

于 2013-03-11T15:07:12.910 に答える
0

ブロック内のコードが自動実行関数のように親にラップされている理由。

コードのその特定の部分は自動実行関数であるため、のようになります。

(b.execScript || function (a) {
    b["eval"].call(b, a)
})(a);

ここで、変数bは実行コンテナを参照します。たとえばwindow、実行aする必要のあるJavaScriptコードが含まれています。

一部のブラウザはサポートexecScript()しますが、一部はサポートするだけeval()なので、コードは次のようにこのブラウザ機能をテストすることで両方をサポートします。

var tmp = b.execScript || function (a) {
  b["eval"].call(b, a)
};

tmpこれは、単一のパラメーターを受け取り、その中のコードを実行する関数ですa。使用できない場合execScriptは、代わりに小さなヘルパー関数が使用されます。そしてそれはこのように呼ばれます:

tmp.call(b, a);

が呼び出されたときに.call()何を参照するかを定義する最初のパラメーター。2番目のパラメーターはの最初のパラメーターになります。thistmptmp

于 2013-03-11T15:28:56.110 に答える