在多个js文件之间,如果需要用到同一个全局变量,在使用之前,需要判断是否已经创建了,如果使用if语句的话,很容易导致错误的发生,所以这里记录一下可用的方法。
一:使用typeof
if(typeof a === 'undefined') {
var a = 'hello world';
console.log(a); // hello world
}
typeof是比较普遍的用法,因为typeof具有特殊的安全机制,即使是对未声明的变量进行运算也不会报错。它对未声明、已声明但是未赋值的变量,都是返回undefined。
二:使用全局变量window
if(window.b === undefined) {
var b = 'this is b';
console.log(b)
}
在全局的变量,都是window的属性,所以可以使用window.b来访问全局变量b,当变量b没有声明时,也不会报错,是因为访问不存在的属性会返回undefined,并不会报错,就是利用全局变量是window的属性的原理来实现的。但是这种方法在非浏览器端使用的话是不生效的,如在node服务端(node可以使用global)
在平常的前端开发中,比较推荐上面这两个方法,还有很多方法,但是会有一些弊端。
if(c === undefined) {
var c = 'this is c';
console.log(c)
}
这样写也是可以,但是在if语句块里边,一定要使用var声明变量c,否则就会报错。原因是使用var声明的时候,变量会在预编译阶段进行声明提前,此时的值为undefined,这就导致在if判断的时候,条件成立,就执行后面的语句了。
但是如果使用let、const来声明的话,变量就不会被提升到作用域顶部,在执行if语句判断的时候,c变量还没有声明,就直接使用的话,会报错:ReferenceError,后面的语句就不执行了。如下:
if(c === undefined) { // ReferenceError: c is not defined
let c = 'this is c';
console.log(c)
}