2012-07-02 31 views
5

最近,在閱讀一本很好的書的同時, 'Maintainable Javascript',我發現使用「use strict」編譯指示。使用Javascript的命名空間中的嚴格模式

如果在全球範圍內聲明「嚴格使用」似乎是一種不好的做法。推薦的方法是直接在這樣的各功能使用嚴格的模式:

// Non-strict code... 

(function(){ 
    "use strict"; 

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

// Non-strict code... 

是否有可能定義嚴格的模式,整個命名空間,而不是在每個功能定義呢?如果是的話,我可以有一兩個代碼樣本嗎?

謝謝。

回答

5

嚴格模式適用於聲明它的執行上下文以及上下文包含的所有上下文(通過eval創建的上下文周圍的某些魷魚,但避免使用eval並避免魷魚性),因此通常使用模塊模式將其應用到所有代碼:

(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爲好。因此,例如,在這個代碼將「工作」(通過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(); 
})(); 

...因爲嚴格模式所做的許多有用的事情之一是擺脫隱含的全局變量的恐懼。

這裏是另外一個例子,在我們的出口,在嚴格的模式下運行,從非嚴格的代碼調用,即使一個功能:

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

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

})(MyModule); 

「寬鬆」的代碼可以調用MyModule.doSomethingUseful,它始終嚴格模式下運行。結果是,您可以應用嚴格模式您的代碼,而不要求您的代碼也使用它的每個人都使用。非常方便,那。

+0

感謝您的編輯,馬特!我這樣做(字符串,而不是嚴格)很多... :-) –

0

第一種方法是當您在.js文件的第一行放置"use strict";編譯指示。因此,該文件中的所有內容都將被嚴格評估。
沒有什麼固有的錯誤。所有瀏覽器遲早會讓舊的js代碼不被使用。如果你使用它,只有真正的缺點可能會破壞舊代碼。

第二方法可能是這樣的對象:

TMP =新o.Pixel(300,300);

} // end 

該代碼允許您擁有「私有」變量。請注意,f也是一個'私人'變種。

用法很簡單:

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

第三條道路可能是T.J.Crowder的,第四個是道格·克羅克福德的...... 這些都是模仿東西是沒有的語言官方目前只是方式不同。

+0

'var contName = new function(){...'這個構造不會做你認爲它做的事。 OP表示他/她認爲有理由不在全球範圍內使用它。 (我不知道這些是什麼,因爲我從來沒有在全球做過**任何事情......)而克羅克福德的名字是「道格拉斯」(或「道格」)。 –

+0

它創建一個對象。名稱已更正;) – CoR

+1

對,它創建一個對象。使用匿名函數中的'prototype'作爲表達式的一部分。這是一個迂迴和誤導性的創建對象的方式。 –

0
var Module = (function() { 
    "use strict"; 

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

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

我認爲這也應該工作。