2010-12-28 6 views
31

私はCoffeeScriptの最新(1.0)のリリースを使用すると、簡単なJavaScriptの出力は、(デフォルトでは)次のようになります。なぜ「は.call(本)」(のCoffeeScriptで追加)javascript関数のラッパーを使用

(function() { 
    var a; 
    a = 1; 
}).call(this); 

.call(this)とは何ですか?追加する理由は何ですか?

+0

このjsを生成するコードも表示できますか? –

+1

私は、すべての変数にデフォルトでローカル関数(グローバルではない)スコープを持たせ、 'this'を通して親スコープにアクセスできるようにする最も簡単な方法だと考えています。 – miensol

+2

これはJSの名前空間のテーマに関する優れた記事です。 //javascriptweblog.wordpress.com/2010/12/07/namespacing-in-javascript/ –

答えて

15

これは関数を作成してから、親関数/オブジェクトスコープで自身を呼び出しています。

.callと.applyは、関数を呼び出すさまざまな方法です。基本的には、独自のスコープ内にa = 1を設定する以外は何もしない関数を作成しました。

JavaScriptでは、すべての関数がオブジェクトであることを認識する必要があります。thisは現在のオブジェクト/関数を参照しています。 .call(this)を使用すると、関数内のthisが上書きされ、呼び出しコンテキストのものに置き換えられます。

33

コンパイルされたCoffeeScriptに変数名のスコープがあることを確認する方法です。これは効率とシンプルさの点で利点があります(生成されたJavaScriptが他のコードで使用されている変数に踏み込まないことがわかります)。 CoffeeScriptコンパイラに対する--bare(または-b)オプションを使用して無効にすることができます。

call(this)理由は、機能が正常に周囲の状況から自分thisオブジェクトを継承していないためだけで、CoffeeScriptのは、それが置かれていますスコープと同じthisを持っていることを確認することです。

+5

これは自己実行機能とどのように違うのですか?次のようになります。 (function(){ /* Code */ })(); – qwertymk

+8

自己実行機能はブラウザコンテキストにロードされていないときに 'this'という概念を失います。いくつかのCommonJSプラットフォームは、特定の 'this'を使ってロードされたファイルを評価します。 – jashkenas

+2

私は変数の範囲の理由を完全に理解していますが、私は効率の利点がどのようにあるのか知りたいのです。あなたは、コンパイラ、または生成されたJavaScriptの効率を指していますか? –

関連する問題