2012-02-28 149 views
2

我正在使用JavascriptMVC(你不需要知道它!)和他們的庫「竊取」來管理文件依賴關係。命名空間和全局變量

我是一個JavaScript初學者,有些東西我沒有得到命名空間;我需要PHP intialized一些全局變量,這些變量將在很多其他的JS文件中使用,這就是爲什麼我想讓他們全球:

的index.php

<script type="text/javascript"> 
steal('jquery', function() { 
    // here is some jquery specific code 
    var appletVersion = '<?php echo $appletVersion; ?>'; 
    var baseUrl = '<?php echo BASE_URL; ?>'; 
}); 
</script> 

在我的JS文件,我不能訪問這兩個變量,因爲我已經把竊取('jquery',function(){...});我想他們在那個街區之外是不可見的。

test.js

steal('jquery', function(){ 
    console.log(baseUrl); // error 
}); 
+0

使用爲什麼不通過學習javascript變量範圍開始? – 2012-02-28 01:32:37

+0

在JavaScript中,global = window。所以如果你聲明一個沒有「var」鍵盤的變量,它實際上被設置爲窗口對象的一個​​屬性。如果你使用「var」,它將被限定到它在裏面聲明的函數。 – 2012-02-28 01:40:10

回答

4

那是因爲你的兩個變量是局部的,以你的函數傳遞竊取。我的建議是始終引用全局變量作爲window.globalName以使您的意圖清晰。

steal('jquery', function() { 
    // here is some jquery specific code 
    window.appletVersion = '<?php echo $appletVersion; ?>'; 
    window.baseUrl = '<?php echo BASE_URL; ?>'; 
}); 
// Now you can access window.appletVersion anywhere in your code 

注意,沒有必要等待偷搶jQuery來初始化這些變量,所以你能做到這一點以外(在全球範圍內的水平)。

命名空間

一個比使用window.globalName更好的解決方案是在全球範圍內創建自己的命名空間,這樣就可以限制你的全局命名空間污染到單個對象。這將有助於調試,因爲您的所有代碼都不會與全局對象上的其他屬性混合在一起。只要console.log它,你將擁有所有你自己的全局變量來查看。

var myNs = {}; // Put all your globals, classes, functions in here to avoid conflicts. 
myNs.appletVersion = '<?php echo $appletVersion; ?>' ; 

在JS

打印PHP值當你在PHP中的值,你想打印的頁面作爲一個JS變量上,你應該使用json_encode。然後,如果字符串嵌入換行符,引號或二進制數據,則不會有問題。你甚至不必擔心類型,json_encode輸出的東西是永遠有效的JavaScript中

myNs.appletVersion = <?php echo json_encode($appletVersion); ?>; 
myNs.baseUrl = <?php echo json_encode(BASE_URL); ?>; 
+0

+1表示在提及全局變量時總是使用window.foo。我最近開始這樣做,它有助於提高可讀性。 – 2012-02-28 01:42:26