JavaScript 变量
发布时间:2023-02-16 14:04:17 所属栏目:Java 来源:互联网
导读:变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。 变量就是存放一些内容的容器。 对于初学者,理解变量是重要的一环。 从分析变量这个名词,可以知道他是一个可以改变的量,这里的量就是代表某一种值。 在 JavaScript 中,变量就是一个用
至于为什么可以省略 window 直接访问到变量,可以参考作用域链章节。 5.4 不使用 var 关键字声明的变量 假如不使用 var 关键字,直接创建变量并赋值: total = ; console.log(total); // 输出:10 在控制台运行后会发现其实并没有报错,输出的结果也正常。 在非ES6模块中,这样创建的变量和使用 var 创建的变量除了不能提前使用之外,没有其他大的区别,会被直接作为 window 对象的属性,成为全局变量。 即便是在函数或者其他存在块级作用域的环境中,这样声明的变量也会作为全局变量。 5.5 连续赋值 var a = b = ; 假如把上面这行代码拆开来可以理解成是这样的: b = ; var a = b; 看似没什么问题,许多开发者也会用这种方式同时声明多个变量,但如果在函数或者独立的作用域中,b 就会成为全局变量,造成全局命名空间的污染。 5.6 重复声明变量 按照之前说的,变量在声明的时候如果没有赋值,则会是 undefined,这个规则在重复声明的情况下不适用。 var num = ; var num; console.log(num); // 输出:1 观察上面这个例子输出的结果,可以发现变量 num 的值并没有改变。 但是如果重新声明的同时做赋值操作,值就会改变。 var num = ; var num = ; console.log(num); // 输出:3 这个例子输出的结果,就是再次声明并赋值后的值。 5.7 提前使用变量 console.log(number); // 输出:undefined var number = ; 这个例子先输出了 number 的值,再声明并对其进行赋值。 代码并没有报错,但如果没有第二行声明,只输出 number: console.log(number); // Uncaught ReferenceError: number is not defined 这样子会爆出变量未定义的错误,说明变量是可以被提前使用,只是没有值,或者说是 undefined 默认值。 具体原因可以参考执行上下文章节。 这里简单的解释可以理解成,在浏览器执行的时候,会把代码调整成如下样子: var number; console.log(number); // 这个时候 number 还没有被赋值,所以输出 undefined number = ; 5.8 常量 常量就是定义并赋值后再也不能修改的量,通常一些不会改变的量,如配置、物理值等会声明为常量,在 ES6 之前是没有提供常量这一特性的。 但是根据常量自身的特性,定义赋值后不能被修改,就可以通过一些方式来模拟常量。 第一种就是采用约定的形式,通常常量都是大写,不同单词之间用下划线分隔。 var PI = ; var DB_ACCOUNT = 'root'; var DB_PASSWORD = 'root'; 这种方式定义的常量本质上还是变量,值还是可以修改的,但因为命名格式采用国际惯例,一眼就能看出是常量,不会对其修改。 这种方式是最简单的方式,但不安全。 第二种方式就是利用对象下属性的描述来控制可写性,将对象的属性设置为只读。 var CONfig = {}; Object.defineProperty(CONfig, 'DB_ACCOUNT', { value: 'root', writable: false, }); console.log(CONfig.DB_ACCOUNT); // 输出:root CONfig.DB_ACCOUNT = 'guest'; console.log(CONfig.DB_ACCOUNT); // 因为不可被改写,所以输出:root 这种方式将常量都放在一个对象下,通过Object.defineProperty定义属性,设定其writable为false,就可以防止被改写。 但有一个问题,CONfig自身这个对象可能被修改。 换一个思路,既然在最外层声明的变量是放在window上的,那可以用这个方式往 window上挂不可改写的属性。 Object.defineProperty(window, 'DB_ACCOUNT', { value: 'root', writable: false, }); console.log(DB_ACCOUNT); // 输出:root DB_ACCOUNT = 'guest'; console.log(DB_ACCOUNT); // 因为不可被改写,所以输出:root 通常情况下 window 对象是不可被修改的,这样常量的安全系数就变得非常高,但缺点是可能性较差,通过一点修改可以提升可读性。 var define = function(name, value) { Object.defineProperty(window, name, { value: value, writable: false, }); }; define('DB_ACCOUNT', 'root'); define('DB_PASSWORD', 'root'); 只要约定好使用 define 函数定义的都为常量即可。 (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |