2016-12-16 2 views
0

私のスクリプトをCoffeescriptでコンパイルするとDOMを操作するのに適したような匿名スタイルの関数でラップするとどうなりますか?Javascript:匿名関数のコードをラップする

  • どのようなメリットがありますか?
  • これにはどのような問題がありますか?
  • 私のコードはより安全ですか?

​​

答えて

3

完全に適切です。これは一般に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(){ }())

0

それは、多かれ少なかれ、セキュアでもないのです。

名前の付いた関数と比較した場合の匿名関数の欠点は、コードブロックが読み込まれるときに1回だけ(または親関数ごとに1回)呼び出されることです。名前で呼び出すことはできません。

名前付き関数とは対照的に、匿名関数の利点は、構文が短いことです。

しかし、この匿名関数をラッパーとして使用するかどうかという問題がある場合は、実際にはそれに利点はありません。余分なコードを追加するだけです。

EDIT:あなたの匿名関数が少し長く変数を含んでいた場合、それらの変数名でグローバルスコープを汚染しないようにすることが有用であることがわかります。しかし、あなたの例では、そうではありません。名前空間のための有用性については、この回答を参照してください。https://stackoverflow.com/a/2421949/4992551