5

最近、とても良い本を読んでいる間、「MaintainableJavascript」、「usestrict」プラグマの使用を発見しました。

「厳密な使用」は、グローバルスコープで宣言されている場合は悪い習慣のようです。推奨される方法は、次のように各関数で直接strictモードを使用することです。

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code...

各関数で定義するのではなく、名前空間全体に厳密モードを定義することは可能ですか?はいの場合、コードのサンプルを1つまたは2つ持つことができますか?

ありがとうございました。

4

3 に答える 3

6

厳密モードは、それが宣言された実行コンテキストと、コンテキストに含まれるすべてのコンテキストに適用されます(を介して作成されたコンテキストの周りにいくらかのsquidginessがありますevalが、使用evalを避け、squidginessを避けます)。したがって、通常はモジュールパターンを使用して適用します。すべてのコードに:

(function() {
    "use strict";

    function foo() {
    }

    function bar() {
    }

    // ...presumably code hooking up `foo` and `bar` to events
    // or otherwise using them -- or of course, you could export
    // them from the scope...
})();

上記では、strictモードは無名関数だけでなく、にも適用さfoobarます。したがって、たとえば、このコードが「機能する」場合(The Horror of Implicit Globalsを介してグローバル変数を作成します):

(function() {
    function foo() {
        someNameThatIsntDefined = 42; // Blech, creates implicit global
    }

    foo();
})();

...このコードはReferenceError(唯一の変更は"use strict")で失敗します:

(function() {
    "use strict";

    function foo() {
        someNameThatIsntDefined = 42; // Throws ReferenceError
    }

    foo();
})();

...厳密モードが行う多くの便利なことの1つは、暗黙のグローバルの恐怖を取り除くことです。

別の例を次に示します。ここでは、非厳密なコードから呼び出された場合でも、厳密なモードで実行される関数をエクスポートします。

var MyModule;
MyModule = MyModule || {};
(function(mod) {
    "use strict";

    mod.doSomethingUseful = doSomethingUseful;
    function doSomethingUseful() {
        // ...
    }

})(MyModule);

「緩い」コードはMyModule.doSomethingUseful、を呼び出すことができます。これは常に厳密モードで実行されます。結果として、コードを使用するすべての人がそれを使用する必要なしにコードに厳密モードを適用できます。とても便利です。

于 2012-07-02T12:23:57.193 に答える
0

"use strict";最初の方法は、.js ファイルの最初の行にプラグマを配置する場合です。したがって、そのファイル内のすべてが厳密に評価されます。
それには本質的に何も問題はありません。遅かれ早かれ、すべてのブラウザーが「古い js コード」を非推奨にするでしょう。古いコードを使用すると、潜在的に古いコードが壊れる可能性があるのは、本当の欠点だけです。

2番目の方法は、次のようなオブジェクトです。

var contName = new function () {
"use strict";


this.tmp;   // public temp var
var tmp;    // private tmp, propagate thru all!


var f = this;   // to call contName.functions when this = html or other object 
var o = this;   // to create objects.

f.rnd = function rnd (range) {
    return Math.floor(Math.random() * range);
};


    function private1 () {     // can be called only inside of contName

     var x = tmp;   // can see all outer private vars
     this.tmp;    // !== outer this.tmp

    var y = this.rnd(x);    // will not work
    var y = f.rnd(x);    // work
    }


o.Pixel = function (x, y, z, col) {
    this.x = x || 0;
    this.y = y || 0;
    this.z = z || 0;
    this.color = col || 0;
};

tmp = 新しい o.Pixel(300, 300);

} // end 

そのコードにより、「プライベート」変数を持つことができます。f も「プライベート」変数であることに注意してください。

使い方は簡単です:

var rvar = contName.rnd(5);
var obj = new contName.Pixel(300, 300)

3 番目の方法は TJCrowder のものかもしれません。4 番目の方法は Doug Crockford のものかもしれません。これらは、言語にまだ正式に存在しないものをエミュレートするためのさまざまな方法です。

于 2012-07-02T12:40:12.553 に答える
0
var Module = (function() {
    "use strict";

    var f = function() {
        // do stuff
    }

    return {  // return your namespace
        "myModuleFunction": f
    }
})();

これもうまくいくはずだと思います。

于 2013-07-16T07:35:59.297 に答える