即使是前端大神有时候也会被一些小埋伏给打趴下,即时防患于未然才是王道,今天小千就来给大家介绍几个JS变量设置中的小埋伏,拿好小本本。
使用var关键字声明的变量即显式声明变量:如:var abc1 = ‘hello’
js允许不使用var声明变量即隐式声明变量:如:abc2 = ‘world’
那么,问题来了,这两种变量有什么不一样的地方吗?
1.如果abc1和abc2 都在全局作用域,在浏览器控制台打印window对象:console.log( window )
如下图:

上图可以看到:在全局的变量abc1和abc2都是window对象的属性,都拥有全局作用域。
2.如果abc1和abc2都在函数作用域,在浏览器控制台打印window对象?

如下图:

上图可以看到:在函数作用域中abc1不会出现在window对象中,是一个局部变量;而abc2依然是window对象的属性,拥有全局作用域。
3.如果abc1和abc2 都在全局作用域,都是window对象的属性,它们是否可以如对象属性一般可以被删除呢?

如下图:

上图可以看到:使用var声明的变量abc1并没有被删除,依然是window对象的属性;而不使用var声明的变量abc2已被删除掉。
为什么会有这样的差别呢?
这与默认的对象属性描述符有关!

如下图:

上图可以看到:window对象的属性abc1的描述符中,configurable: false 表示该属性不可配置、不可删除。

如下图:

上图可以看到:window对象的属性abc2的描述符中,configurable: true 表示该属性可配置、可删除。
正是对象属性描述符中的默认设置不一样,导致了是否可删除的差异!
在js中变量声明和函数声明会出现‘声明提升’,js引擎解析执行代码时分为两个阶段:1.预解析阶段;2.逐行执行阶段。
在预解析阶段变量abc1被声明并赋初始值为undefined;在逐行执行阶段变量abc1被赋值为‘hello’;所以,在变量声明之前打印不会报错,打印的值为undefined。

©著作权归作者所有:来自51CTO博客作者戏精程序媛的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. JS变量中你不知道的小埋伏
  2. 下划线_在Python中的用途
  3. 大数据成神之路-Java高级特性增强(Volatile)
  4. 硬盘分区属性0字节怎么恢复?
  5. 重载get
  6. 属性0字节. 不知道如何找回呢
  7. 【面试】两个变量进行交替的N种方法
  8. Terraform,变量详解
  9. Terraform,基本语法

随机推荐

  1. java中的日志框架梳理(以故事的形式呈现)
  2. 为什么我选用了springcloud而不是dubbo
  3. Tomcat+Servlet面试题都在这里
  4. mysql从入门到优化(3)事务的基本操作
  5. 可重入读写锁ReentrantReadWriteLock的使
  6. SVG基础知识
  7. 大白话讲述分布式系统中的CAP理论
  8. 一个古老而又经典的算法-汉诺塔问题
  9. mysql从入门到优化(1)基本操作上
  10. 学习分布式不会BASE理论?看这篇文章保证能