私のスクリプトをCoffeescriptでコンパイルするとDOMを操作するのに適したような匿名スタイルの関数でラップするとどうなりますか?Javascript:匿名関数のコードをラップする
- どのようなメリットがありますか?
- これにはどのような問題がありますか?
- 私のコードはより安全ですか?
私のスクリプトをCoffeescriptでコンパイルするとDOMを操作するのに適したような匿名スタイルの関数でラップするとどうなりますか?Javascript:匿名関数のコードをラップする
完全に適切です。これは一般にIIFEとして知られています。
利点は以下のとおりです。
あなたは「名前空間の下で働く」ことにより、変数の命名の衝突を避けることができます - 変数の命名とスコープの設定:
(function ($, DOM, ultraSelector) {
$(DOM).find(ultraSelector); // $ is always jQuery
})(jQuery, document, 'mySelector');
$ = false; // here $ is not jQuery anymore
あなたの変数がスコープで管理したまま、世界的に決してアクセスできない。そして
あなたは'use strict'
安全に生命維持の内部コードのみが影響を受けるであろうことを知ってすることができます
(function() {
'use strict';
globalVariable = true; // will throw error
var scopedVariable = true; // only accessible inside this IIFE
})();
globalVariable = true; // will define a global variable
var scopedVariable = true; // is not really scoped, since its scope is global
を私ははい、そのはより安全だと思います。あなたの変数は、ブラウザコンソールから簡単にはアクセスできません。 Douglas Crockfordないよう
私は強く、IIFEsを使用することをお勧めします - http://javascript.crockford.com/ を、彼は宣言内でなければなりません括弧を提唱カントー... (function(){ }())
それは、多かれ少なかれ、セキュアでもないのです。
名前の付いた関数と比較した場合の匿名関数の欠点は、コードブロックが読み込まれるときに1回だけ(または親関数ごとに1回)呼び出されることです。名前で呼び出すことはできません。
名前付き関数とは対照的に、匿名関数の利点は、構文が短いことです。
しかし、この匿名関数をラッパーとして使用するかどうかという問題がある場合は、実際にはそれに利点はありません。余分なコードを追加するだけです。
EDIT:あなたの匿名関数が少し長く変数を含んでいた場合、それらの変数名でグローバルスコープを汚染しないようにすることが有用であることがわかります。しかし、あなたの例では、そうではありません。名前空間のための有用性については、この回答を参照してください。https://stackoverflow.com/a/2421949/4992551