命名空间和全局变量

Mat*_*hew 2 javascript

我正在使用JavascriptMVC(你不需要知道它!)和他们的库"窃取"管理文件依赖.

我是javascript的初学者,并且我没有使用命名空间的东西; 我需要一些由PHP初始化的全局变量,这些变量将用于很多其他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>
Run Code Online (Sandbox Code Playgroud)

在我的JS文件中,我无法访问这两个变量,因为我已经把steal('jquery',function(){...}); 而且我猜他们在那个街区之外是不可见的.

test.js

steal('jquery', function(){
   console.log(baseUrl);  // error
});
Run Code Online (Sandbox Code Playgroud)

Jua*_*des 5

那是因为你的两个变量是你传递给steal的函数的本地变量.我的建议是始终引用全局变量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
Run Code Online (Sandbox Code Playgroud)

请注意,无需等待窃取来抓取jQuery来初始化这些变量,因此您可以在外部(在全局范围级别)执行此操作.

命名空间

比使用更好的解决方案window.globalName是在全局级别创建自己的命名空间,以便可以将全局命名空间污染限制为单个对象.这将有助于调试,因为所有代码都不会与全局对象上的其余属性混合.只需console.log它,你就可以看到所有你自己的全局变量.

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

在JS中打印PHP值

当你在PHP中有一个值并且想要在页面上将它作为JS变量打印时,你应该使用json_encode.如果您的字符串嵌入了换行符,引号甚至二进制数据,那么您将不会遇到任何问题.您甚至不必担心类型,json_encode输出始终有效用于JavaScript的内容

myNs.appletVersion = <?php echo json_encode($appletVersion); ?>;
myNs.baseUrl = <?php echo json_encode(BASE_URL); ?>;
Run Code Online (Sandbox Code Playgroud)