2011-05-20 16 views
5

我正在使用Knockout.js和jQuery構建工作中的新應用程序。我更喜歡在腳本中使用"use strict",但由於我們使用的一些庫不適用於"use strict",我必須使用功能表單。<script>標記中的函數是如何作用域/名稱空間的?

我不喜歡在內嵌<script>標籤內置JavaScript,所以我通常將所有內容放在一個單獨的文件中,以便可以通過預處理器縮小和縮小它。

鑑於這些標準,我想知道如何在腳本標記中創建它們時默認作用域。現在我只是在做這樣的事情:

$((function(win) { 
    "use strict"; 

    win.myFunction = function() { 
     // do stuff 
    }; 
}(window))); 

正如你看到的,我把我window對象的功能,這樣我就可以在我看來,給他們打電話。我注意到,我可以在我的jQuery模板中調用它們,而無需限定它們(即:如果是window.myFunction,我可以調用myFunction),但是我擔心這不適用於所有瀏覽器。是否所有瀏覽器都允許您調用放置在窗口對象中的函數,而不使用完全限定名稱?我如何在上面定義的匿名方法中將函數放置在全局範圍內?

感謝您的洞察!

+0

你有一個額外的右括號,你調用的函數不會返回任何東西,所以你將'undefined'傳遞給'jQuery()'函數。 – user113716 2011-05-20 21:11:49

+0

我確實有一組額外的括號(不是額外的一個),但這是'$(document).ready(function(){});'語法的簡寫。請參閱http://api.jquery.com/ready/以查看正在使用的此語法。 – 2011-05-20 21:16:23

+0

你是對的,它是一套你不需要的,我對這個捷徑非常熟悉。但是你將'undefined'傳遞給那個快捷方式,因爲你正在調用沒有返回值的函數。因此,'.ready()'的快捷方式除了返回一個空的jQuery對象之外沒有任何其他功能。 – user113716 2011-05-20 21:30:43

回答

6

窗口對象本質上是的全局範圍。任何不作用於函數的變量都是窗口對象的屬性。

您可以通過它設置爲窗口對象的屬性設置一個全局變量,你只是做:

window.myFunction = function() { 
    // do stuff 
} 

然而,這可能不是一個好主意,垃圾全局命名空間的名稱。這種方式混亂,不可維護的代碼和奇怪的錯誤進來。例如,所有jQuery函數都是jQuery(或$)對象的屬性或子屬性。這意味着他們可以定義jQuery.each,而不必擔心與全球的方法衝突。您應該考慮對自己的代碼進行相同的操作:創建一個全局命名空間對象來容納所有「全局」方法。

+0

所以如果我創建自己的「全局」名稱空間,我可以將它放在窗口對象上,並通過調用'myNameSpace.whatever'而不是'window.myNameSpace.whatever'來從我的視圖中訪問它。 – 2011-05-20 21:10:35

+0

@斯科特我並不完全和你在一起,但我希望如此,是的。 – lonesomeday 2011-05-20 21:14:59

+0

感謝您的幫助。這是一個更好的方法。我創建了自己的全局名稱空間並將其放置在'window'對象中。它工作得很好。乾杯! – 2011-05-20 21:21:39

相關問題