一些开发人员不喜欢通过 window 来访问全局对象,尤其当代码需要运行在多种 JavaScript 环境中时(不仅仅是浏览器,还有服务器端,如 node.js 等),因为此时全局对象并非总是 window。
从技术角度来说,typeof 的安全防范机制对于非全局变量也很管用,虽然这种情况并不多 见,也有一些开发人员不大愿意这样做。如果想让别人在他们的程序或模块中复制粘贴你 的代码,就需要检查你用到的变量是否已经在宿主程序中定义过:
function doSomethingCool() {
var helper =
(typeof FeatureXYZ !== "undefined") ?
FeatureXYZ :
function() { /*.. default feature ..*/ };
var val = helper();
// .. }
其他模块和程序引入 doSomethingCool() 时,doSomethingCool() 会检查 FeatureXYZ 变量是 否已经在宿主程序中定义过;如果是,就用现成的,否则就自己定义:
// 一个立即执行函数表达式(IIFE,参见《你不知道的JavaScript(上卷)》“作用域和闭包” // )
(function(){
function FeatureXYZ() { /*.. my XYZ feature ..*/ }
// 包含doSomethingCool(..) function doSomethingCool() {
var helper =
(typeof FeatureXYZ !== "undefined") ?
FeatureXYZ :
function() { /*.. default feature ..*/ };
var val = helper();
// .. }
doSomethingCool();
})();
这里,FeatureXYZ 并不是一个全局变量,但我们还是可以使用 typeof 的安全防范机制来做 检查,因为这里没有全局对象可用(像前面提到的 window.___)。
还有一些人喜欢使用“依赖注入”(dependency injection)设计模式,就是将依赖通过参数 显式地传递到函数中,如:
function doSomethingCool(FeatureXYZ) {
var helper = FeatureXYZ ||
function() { /*.. default feature ..*/ };
var val = helper();
// ..
}
上述种种选择和方法各有利弊。好在 typeof 的安全防范机制为我们提供了更多选择。
JavaScript 有 七 种 内 置 类 型:null、undefined、boolean、number、string、object 和
symbol,可以使用 typeof 运算符来查看。 变量没有类型,但它们持有的值有类型。类型定义了值的行为特征。
很多开发人员将 undefined 和 undeclared 混为一谈,但在 JavaScript 中它们是两码事。 undefined 是值的一种。undeclared 则表示变量还没有被声明过。
遗憾的是,JavaScript 却将它们混为一谈,在我们试图访问 “undeclared” 变量时这样报 错:ReferenceError: a is not defined, 并 且 typeof 对 undefined 和 undeclared 变 量 都 返 回 “undefined”。
然而,通过 typeof 的安全防范机制(阻止报错)来检查 undeclared 变量,有时是个不错的 办法。