2012-03-19 9 views
7

私は本当に良いJavaScriptユーザーではありませんが、私はそれを完了することができます。私はJavaScriptで書いたコードが誇りではないので、私はそれを変更することに決めました。ここに私の最初のステップがあります:JavaScriptで有効なスコープの方法

私はプロジェクトのための私自身のライブラリを作成しようとしています、そして、以下は初期の構造です。

window.fooLib = {}; 

(function (foo) { 
    "use strict"; 

    foo.doSomeStuff = function(param1) { 

     console.log(new AccommProperty(param1)); 
    } 

    //some internal function 
    function AccommProperty(nameValue) { 
     var _self = this; 
     _self.name = nameValue; 
    } 

}(fooLib)); 

私は私の変数を初期化するために、ここですぐに呼び出される関数式を使用。この場合、それはfooLibです。

window.fooLibをより安全にするために他の何かを行うべきかどうかはわかりません。 JavaScriptを正しく理解すれば、コードの後に​​実行される他のコードによってオーバーライドすることができます。

あなたの考えは?

+0

"use strict"を使用してください。あなたを守り、あなたができることはすべてです。 – Christoph

+0

@Christoph私はあなたが見ることができるように上記の "厳密な使用"を使用しました。これは正しい方法とそれを使用する場所ですか? – tugberk

+2

[john resigの記事を参照してください](http://ejohn.org/blog/ecmascript-5-objects-and-properties/)どのように保護を実現するか、https:// developerの 'Object.freeze(obj)' .mozilla.org/ja/JavaScript/Reference/Global_Objects/Object/freeze – Christoph

答えて

1

変数を上書きしないようにするには、Object.defineProperty()をwritable:false、configurable:falseに設定します。あなたの場合:

まだ、それには理由がありません。 EcamScript 5.1が動作する必要があり、シムはまったくありません。 =オペレータで上書きしないようにゲッタ/セッタを使用しているかもしれません。

また、ライブラリを上書き禁止にする必要はありません。 libをオーバーライドするサイトでコードを使用しないでください。あるいは、誰かがあなたの関数を同じインタフェースを持つ別のよりよいlibに上書きしたいと思っているかもしれませんか?

共有するライブラリについての質問で、他の人との可能な名前空間の競合については、jQuery.noConflictをご覧ください。

0

すべてのJavaScriptオブジェクトをオーバーライドできます。これはJavaScriptの性質であり、変更することは不可能です。だから、その意味でコードを安全にすることはできません。

セルフインボークされた関数について:ローカル変数を持ち、すべての関数に実行可能にしたい場合に使用してください。だからあなたのケースではAccommPropertyはそのような変数です。範囲内にdoSomeStuffを定義すると、doSomeStuffがスコープ内で定義された変数を使用しない限り、違いはありません。

変数をユーザーから隠したい場合や、グローバルが必要な場合に、名前の競合に敬意を表している場合は、自己呼び出し関数を使用してください。

+0

ありがとう!私のサンプルコードを変更しました。それは今私が考えるより意味をなさない。 – tugberk

-1

私はwindow.fooLibをより安全にするために何か他のことをしなければならないか分かりません。 JavaScriptを正しく理解すれば、コードの後に​​実行される他のコードによってオーバーライドすることができます。

代わりにwindow.fooLibをローカル変数にすることができます。

(function() { 

    // all functions nested in foo() have access to fooLib. 
    fooLib = {} 

    fooLib.doSomeStuff = function(param1) { 
     console.log(param1); 
     console.log(fooLib); 
    } 

    //some internal function 
    function AccommProperty() { 
     console.log(fooLib); 
    } 

}()); 

は詳細についてはJavascript Closures: Encapsulating Related Functionalityを参照してください:closures and nested functions 1を使用すると、グローバルスコープに入れるか、windowオブジェクトに取り付けるのではなく、すべてのデータを置くことができ、名前空間をエミュレートすることができます。

+0

でも、この場合、このIIFEの外では 'fooLib'を使うことはできません。ライブラリを作成したいのかどうかは分かりません。または私は間違っていますか? – tugberk

+0

あなたのfooLibはウィンドウにも接続されています...外部アクセスを提供するには、その必要があります(それはライブラリの意味ですか?)あなたが作成したJS内のオブジェクト(ES3)は、 ES5で保護してください。 – Christoph

+0

@tugberk:ライブラリ全体をローカル変数としてライブラリの状態を保持する1つの関数に置きます。すべてのライブラリ関数はネストされた関数になります。 –

関連する問題