0

CoffeeScriptで自己実行型の無名関数を使用して名前空間を実装しようとしています。

JavaScriptで名前空間を宣言するにはどうすればよいですか?

http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/

また、「未定義」が再定義されないように保護したかったのは、それが記事で推奨されているためです。

したがって、CoffeeScriptでは、次のようなことができます。

((skillet, $) ->
  skillet.fry ->
    alert('hi');
)( window.skillet = window.skillet || {}, jQuery);

記事で説明されている形式に近づきます。

(function(skillet, $) {
  return skillet.fry(function() {
    return alert('hi');
  });
})(window.skillet = window.skillet || {}, jQuery);

しかし、未定義を追加しようとすると、厳密モードが原因でコンパイルエラーが発生します。

http://arcturo.github.com/library/coffeescript/07_the_bad_parts.html

「undefinedなどの特定の変数は書き込みできなくなりました」

これを回避する方法があるかどうか疑問に思いましたか?厳密モードを使用することには、私が十分に認識していない利点がある可能性があるため、厳密モードをオンのままにしておきたいと思います。しかし、それをオフにする方法をグーグルでさえ...私はnilを思いついた。

見てくれてありがとう!

4

2 に答える 2

2

CoffeeScriptコードを自己実行型の匿名でラップしても意味がありません。これはコンパイラによってデフォルトですでに実行されています。

alert "Foo"

にコンパイルされます

(function() {
  alert("Foo");
}).call(this);

$たとえば参照を確認したい場合はjQuery、ローカル変数を追加するだけです。

$ = window.jQuery
skilett = window.skilett ? {}
# ... rest of the code ...

undefinedとにかく(エラーメッセージが示すように)書き込み可能ではないため、厳密モードを使用しているときに保護しようとしても意味がありundefinedません。

「通常」モードでは、次undefinedのようにコードの先頭に値を持つ変数を生成できます(「未定義」の代わりにこれを使用するだけです)。

undef = ((u) -> u)()
于 2012-07-25T22:23:12.430 に答える
1

「未定義」も再定義されないように保護したかった

strictモードが原因でコンパイルエラーが発生しました:「undefinedなどの特定の変数は書き込み可能ではなくなりました」

それであなたの問題は何ですか?undefinedCoffeeScriptではこの「変数」を使用できないため、引数を宣言する必要はありません。

サードパーティのスクリプトが値を割り当てることを本当に(必要/したい)心配しているundefined場合は、コードでそれを使用しないでください。代わりに、いつでもtypeof演算子またはCoffeeScripts実存演算子を使用できます。

心配しないでください。明示的に悪意のある攻撃を除いて、誰もそのようなエラーに遭遇したことはないと思います。

于 2012-07-25T22:23:07.630 に答える