加入收藏 | 设为首页 | 会员中心 | 我要投稿 莱芜站长网 (https://www.0634zz.com/)- 云连接、建站、智能边缘云、设备管理、大数据!
当前位置: 首页 > 编程开发 > Java > 正文

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 函数定义的都为常量即可。

(编辑:莱芜站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读