5

最近,一边看一本很好的书;'Maintainable Javascript',我发现了“use strict”编译指示的使用。

如果在全局范围内声明“use strict”,它似乎是一种不好的做法。推荐的方法是在每个函数中直接使用严格模式,如下所示:

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code...

是否可以为整个命名空间定义严格模式,而不是在每个函数中定义它?如果是,我可以提供一两个代码示例吗?

谢谢你。

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...
})();

在上面,严格模式不仅适用于匿名函数,而且也适用于foobar。因此,例如,此代码将“工作”的地方(通过隐式全局的恐怖创建一个全局变量):

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

    foo();
})();

...这个代码失败了ReferenceError(唯一的变化是"use strict"):

(function() {
    "use strict";

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

    foo();
})();

...因为严格模式所做的许多有用的事情之一就是摆脱隐式全局变量的恐惧。

这是另一个示例,我们导出了一个在严格模式下运行的函数,即使从非严格代码调用时也是如此:

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 代码”。如果你使用它,唯一真正的缺点可能是可能会破坏旧代码。

第二种方式可能是这样的对象:

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 = new o.Pixel(300, 300);

} // end 

该代码允许您拥有“私有”变量。请注意, f 也是一个“私有”变量。

用法很简单:

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

第三种方式可能是 TJCrowder 的,第四种是 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 回答