所在的位置: js >> js介绍 >> js中的Undeclared

js中的Undeclared

白癜风会治好吗 http://baidianfeng.39.net/qzzt/bdfnzhm/

typeofUndeclared

安全防范机制对在浏览器中运行的JavaScript代码来说还是很有帮助的,因为多个脚本文件会在共享的全局命名空间中加载变量。

很多开发人员认为全局命名空间中不应该有变量存在,所有东西都应该被封装到模块和私有/独立的命名空间中。理论上这样没错,却不切实际。然而这仍不失为一个值得为之努力奋斗的目标。好在ES6中加入了对模块的支持,这使我们又向目标迈近了一步。

举个简单的例子,在程序中使用全局变量DEBUG作为“调试模式”的开关。在输出调试信息到控制台之前,我们会检查DEBUG变量是否已被声明。顶层的全局变量声明varDEBUG=true只在debug.js文件中才有,而该文件只在开发和测试时才被加载到浏览器,在生产环境中不予加载。

问题是如何在程序中检查全局变量DEBUG才不会出现ReferenceError错误。这时typeof的安全防范机制就成了我们的好帮手:

这不仅对用户定义的变量(比如DEBUG)有用,对内建的API也有帮助:

if(typeofatob===undefined){atob=function(){/*..*/};}

还有一种不用通过typeof的安全防范机制的方法,就是检查所有全局变量是否是全局对象的属性,浏览器中的全局对象是window。所以前面的例子也可以这样来实现:

if(window.DEBUG){//..}

if(!window.atob){//..}

与undeclared变量不同,访问不存在的对象属性(甚至是在全局对象window上)不会产生ReferenceError错误。

一些开发人员不喜欢通过window来访问全局对象,尤其当代码需要运行在多种JavaScript环境中时(不仅仅是浏览器,还有服务器端,如node.js等),因为此时全局对象并非总是window。

从技术角度来说,typeof的安全防范机制对于非全局变量也很管用,虽然这种情况并不多见,也有一些开发人员不大愿意这样做。如果想让别人在他们的程序或模块中复制粘贴你的代码,就需要检查你用到的变量是否已经在宿主程序中定义过:

其他模块和程序引入doSomethingCool()时,doSomethingCool()会检查FeatureXYZ变量是否已经在宿主程序中定义过;如果是,就用现成的,否则就自己定义:

这里,FeatureXYZ并不是一个全局变量,但我们还是可以使用typeof的安全防范机制来做检查,因为这里没有全局对象可用(像前面提到的window.___)。

还有一些人喜欢使用“依赖注入”(dependencyinjection)设计模式,就是将依赖通过参数显式地传递到函数中,如:

上述种种选择和方法各有利弊。好在typeof的安全防范机制为我们提供了更多选择。

小结

JavaScript有七种内置类型:null、undefined、boolean、number、string、object和symbol,可以使用typeof运算符来查看。

变量没有类型,但它们持有的值有类型。类型定义了值的行为特征。很多开发人员将undefined和undeclared混为一谈,但在JavaScript中它们是两码事。undefined是值的一种。undeclared则表示变量还没有被声明过。

遗憾的是,JavaScript却将它们混为一谈,在我们试图访问undeclared变量时这样报错:ReferenceError:aisnotdefined,并且typeof对undefined和undeclared变量都返回undefined。

然而,通过typeof的安全防范机制(阻止报错)来检查undeclared变量,有时是个不错的办法。




转载请注明:http://www.aierlanlan.com/rzfs/1748.html