2011-10-31 8 views
0

私ははネームスペースと連携する方法を理解する助けが必要:(

myNameSpace = function(){ 
    var current = null; 
    function init(){...} 
    function change(){...} 
    function verify(){...} 
    return{ 
    init:init, 
    change:change 
    } 
}(); 
  • (悲しいことに、私はそれを完全に理解していないことを)良いJSの実践のためのインターネット上で検索すると、面白いものを見つけました。どこでこの名前空間を使用することができますか?
  • 私は名前のペースを使用するにはどうすればよい?
  • が、それは本当に良いアイデアではなく、グローバルでこれを使用することですか?

スクリプトのソース:http://dev.opera.com/articles/view/javascript-best-practices/

+0

これらの質問はすべて記事で回答されていると思います。 – Blender

+0

こんにちはブレンダー、悲しいことに、記事はあなたが既にJSをマスターしていると仮定しているので、私は – ajax333221

+1

* workspace *と* workspace *のように説明しません。もしそうなら、* namespace *だけを使うように質問を編集できますか?そうでない場合は、あなたが意味することを説明してください。 – stivlo

答えて

1

また、このようなコードを使用すると、OO JavaScriptコードを記述できます。 1つのユニットにまとまった機能だけをグループ化し、必要に応じてこのように多くのオブジェクトを構築する必要があります。

function buildFullNameは外部からアクセスできないため、プライベート機能です。

私はあなたに同意します。以前のJavaScriptの知識はありません。実際、関数はJavaScriptのファーストクラスのObjectです。関数内に関数を入れ子にすることができ、変数を持つことができますし、それらを組み合わせる方法はたくさんあります。Javaのような標準的な方法はありません。私は、記事JavaScript Closure 101は物事を少しクリアするのに役立つと思います。

/** This is our Object definition and constructor */ 
function Person(fname, lname) { 
    this.firstName = fname; 
    this.lastName = lname; 
} 

/** Anonymous function to avoid polluting the global namespace */ 
(function() { 

    /** This function will be defined public, we prefix the class name */ 
    function Person_toString() { 
     //call buildFullName passing this, we could also call the function 
     //as buildFullName(), and it would work, but wouldn't have 'this' 
     return buildFullName.call(this); 
    } 

    /** Another public function */ 
    function Person_buildGreeting() { 
     return "Hi " + this.firstName; 
    } 

    /** This function is private! */ 
    function buildFullName() { 
     return this.firstName + " " + this.lastName; 
    } 

    /** Here we augment the Object with public functions */ 
    Person.prototype = { 
     toString: Person_toString, 
     buildGreeting: Person_buildGreeting 
    }; 

})(); //execute the anonymous function immediately 

使用例:

var p1 = new Person('Jenny', 'Fairview'); 
alert("toString()=" + p1.toString()); 
alert("buildGreeting()=" + p1.buildGreeting()); 
+0

偉大な例、これは – ajax333221

0

これは1つの貧弱な記事で、少なくともグローバルを避けるためのセクションでした。あなたのコードが非常に大きくなり、最終的に接頭辞を付けるようになると、これらのことが起こります。たとえば、dojoです。 All/Most dojoの関数はdojo.で始まるので、読み込んだときには関数を上書きしません(もちろん、dojoという関数や変数がないと仮定します)。

フォーム1000個の機能

function init(){...} 
function run(){...} 
function start(){...} 

を持っている場合、彼らが作っているの引数が、それは私は後者を好む

packageName = function{ 
init : function init(){...} , 
run : function run(){...} , 
start : function start(){...} 
} 

より

packageName = function{ 
function init(){...} 
function run(){...} 
function start(){...} 
return { 
    init : init , 
    run : run , 
    start : start 
} 

を行うために簡単だということです。よりクリーンで、より簡潔で、混乱も少なくなります。

+0

あなたの好みの構文は、質問の構文と同じではありません。質問がそれをする方法は、関数が名前で直接簡単に呼び出すことができ、(おそらくもっと重要なことに) 'current'と' verify() 'はプライベートです。あなたのやり方も便利ですが、 'this.functionname()'(どのように呼び出されているかによって違うかもしれません)や 'packageName'名前空間プレフィックスを使わずに関数同士を呼び出すことはできません。 (また、 'packageName'が関数やオブジェクトリテラルに代入されることを意味しましたか?) – nnnnnn

+0

1000個の関数を一緒に詰め込むのは良い考えではありませんが、あなたは単にポールパーラーを書いたと思います。小さな結束単位は10点以上にする必要があります。 – stivlo

+0

@nnnnnnそれは本当です、私はそれを考慮しなかった – puk

0

あなたはさらに少し行くと、あなたのアプリケーションを構築し、ほとんど完全にグローバルを避けるために、CommonJSまたはAMDモジュールを使用することができます。 Dojoはこの方向に進んでいますが、まだDojoを使用していない状態に移行していません。*

関連する問題