4

重複の可能性:
感嘆符は関数の前に何をしますか?

このページから来ているように見える「ツイート」ボタンで既存のサイトを維持しています

ここの同僚は素晴らしい質問を提起しました:なぜこのスクリプトタグundefinedはこの自己呼び出し関数の(returnステートメントなしで)値を逆にするのですか?(読みやすさのためにかなり精巧で、オリジナルはリンクにあります)

<script>
  !function(d,s,id) {
//^--- that
    var js,fjs=d.getElementsByTagName(s)[0];
    if(!d.getElementById(id)) {
      js=d.createElement(s);
      js.id=id;
      js.src="https://platform.twitter.com/widgets.js";
      fjs.parentNode.insertBefore(js,fjs);
    }
  }(document,"script","twitter-wjs");
</script>

私の非JSプロの目には、それはのブール値を反転させているように見え、それによってタグundefined全体がtrueと評価されるようになります。<script>価値があるのは、それは私にとってまったく異質な考えです(その<script>タグには式の値があります)。

私の期待は、<script>タグのブール値(そう、それを入力しても気が狂う)が重要な特定のブラウザーがあることです。

したがって、基本的な質問は次のとおりです。aは、<script>知っているブラウザにとって意味のある「式」の値を持っていますか?この場合、真と偽の暗黙の意味は何ですか?

4

2 に答える 2

4

何が起こっているのか、そしてその理由の説明...

Javascriptでは、とがfunction statementsありfunction expressionsます。それらの2つは似ていますが、正確ではありません。

関数ステートメント

function myTest() {return true;}

関数式

var f = function() {return true;}
alert(f()); //

alert(function() { return true}); // Return value is used

// and even

(function(x, y) {
  var z, x; // private variables, hidden from the outside scope
  var r = x  + y;
  // Return value is ignored.
}(1, 2));

// The ! can be used to start a function expression too.
// This is totally legal Javascript, but it isn't in the normal
// "vernacular" of the langage
!function(x, y) {
  var z, z1; // Private vars
  // Do something with side effects
  // Return value is ignored.
}(x, y);

コメントにより更新

//The following code works identical:
var v1 = (function(a, b) {return a+b}(1,2));
var v2 = (function(a, b) {return a+b})(1,2);
var v3 = function(a, b) {return a+b}(1,2)

最初のフォームは、エディターでブロックマッチングツールを使用できるため、私は最初のフォームを好みます。このf1フォームは、時々役立つプログラムJSLintおよびJSHintによって好まれます。

すべて関数式を作成し、すぐに呼び出します。この場合、ParensはJavascriptコンパイラでは必要ありませんが、これは通常の割り当てではないことを読者に示す非常に便利なヒントとして役立ちます

一方、関数ステートメントではなく関数式があることをJSエンジンに伝えるための何かが必要です。上記の=記号は機能しますが、割り当てがない場合は、何らかの演算子から始める必要があります。(+!

!function(x, y) {alert(x, y)}(1, 2);

先頭の演算子はそれをにします。上記()の例では、それを式に強制します。

于 2012-10-24T17:20:10.837 に答える
0

このコードは、新しいスクリプトタグを作成し、idのscript要素がない場合は、script型の最初の要素の前に追加しますtwitter-wjs

!はJavascriptのNOT演算子であるため、そのオペランドをいつ変換できるかを評価しますtruefalseこの場合、idを持つ要素がtwitter-wjs存在しない場合は、をdocument.getElementById("twitter-wjs")返しますundefined。Javascriptのこれは偽の値であるため、!演算子と組み合わせた結果は次のようになりますtrue。内のコードのブロックifが実行されます。Javascriptのオブジェクトはtrue、そのブール値をチェックするときに実行されるため(実行してみて!![Object]ください。証明します)if、。によって要素が返されたときにブロックは実行されませんdocument.getElementById()

更新:
あなたのコメントに関して、@ JeremyJStarcherの答えは大丈夫だと思いますが、私は何かを追加しています:
あなたのコードには。がありfunction expressionます。function expressions識別子は必要ありません。しかし、実行するとき、Javascriptインタープリターはそれを混乱させてと考えるかもしれませんfunction declaration。ではfunction declarations、識別子はオプションではないため、インタプリタは構文エラーをスローします。これを回避!するために、ここでは演算子が使用されているため、として扱われますfunction expression

于 2012-10-24T17:05:02.417 に答える