0

他のライブラリやグローバルアイテムとの競合を避けるために、JavaScript の名前を適切に付ける方法を見つけようとしていました。私はいくつかのコードを見直していて、JavaScript に関して理解できないことに気付きました。実際には、質問の仕方さえ知らないので、不自然なコード例をいくつか使用します。

var varFuncTest = (function(){
         _funcTest = function(params){
       return "These are the params that were passed in: " + params;
     };
     return _funcTest;
})();

console.log(varFuncTest("params params params"));

出力: 渡されたパラメータは次のとおりです: params params params

このコードを実行すると、期待どおりに動作しますが、これは、変数を宣言したときに、特殊な関数を構築して返す関数を () でラップし、その後すぐに () を追加したためです。関数呼び出しをログに記録すると、正しい文字列が出力されます。

余分な () のセットを最後から削除すると、訓練を受けていない私の目には不要に見えたため、ログには文字列ではなくオブジェクト タイプが出力されます。

var varFuncTest = (function(){
         _funcTest = function(params){
           return "These are the params that were passed in: " + params;
         };
         return _funcTest;
    });

    console.log(varFuncTest("params params params"));

出力: 関数()

ここで何が起こっているのですか?() の 2 番目のセットが必要なのはなぜですか? これが JavaScript 言語の特別な機能である場合、それは何を参照し、そのドキュメントは JavaScript API 内のどこにありますか?

このコードは、最初の例の 6 行目の最後の () を除いたものと同じです。実際には JavaScript 内の実行に影響するため、タイプミスではありません。どちらも、変数に割り当てられている関数オブジェクトを返します。

4

2 に答える 2

3

これらの括弧を常に使用します。

alert('foo');

ここで、括弧は関数を呼び出し、alert引数を渡します'foo'

たとえば、次の関数を使用します。

function test() {
    alert('foo');
}

実行testすると、関数への参照のみが提供されます。test()その参照を取得して呼び出します。

あなたの特定の例では、これがまさに起こっていることです:

var varFuncTest = (function(){
     _funcTest = function(params){
       return "These are the params that were passed in: " + params;
     };
     return _funcTest;
})();

function() {...}別の関数 ( _funcTest) を返します。関数を返す最後の呼び出しの括弧。それらを省略するvarFuncTestと、関数が格納されます。それらを保持すると、代わりにその関数の出力varFuncTestが保存されます。

これを説明するために、コードの 2 番目のチャンクを実行してから、これを実行します。

varFuncTest();

最初のコード チャンクと同じ出力が得られるはずです。

于 2012-10-31T21:25:43.337 に答える
1

Javascript にはimmediately invoked function. これは、定義されるとすぐに呼び出される関数です。function expressionsこれらはの代わりにする必要がありfunction statementsます。

var a = function() {return "hi"}; // A reference to a function.. to call later.
alert(a()); // Call the function now.

var a = (function() {return "hi"}()); // Call the function, return the value in one stop.
// a now has the result of the function.
alert(a);

与えられた答えの多くは真実、または真実っぽいですが、誰も言及していない別の側面があります.

などの課題を行うとき

var a = (function() {}());

最も外側のレベルの括弧はコンパイラには必要ありませんが、すぐに呼び出される関数が配置されていることをコードを読んでいる人間に通知するためにサーバーを提供します。

一方、次のようなコード

(function() {}());  // One style
(function() {})();  // Another style

括弧function-expression、コンパイラに式を読み取らせるために必要ですfunction statement

function次のように、キーワードの前に他のほとんどすべての演算子を使用できます。

!function() {}();  // Another style

それは機能しますが、Javascript の通常の「イディオム」ではありません。

TL-DR: かっこは、コンピューターよりも人間のためにあります。

ところで: 標準のコーディング規約に従ってください。あなたができる非標準だが合法的なことはたくさんあります。しないでください。それはあなたの後に来る人を混乱させます。

于 2012-10-31T21:41:42.680 に答える