JavaScript 常见概念:变量提升、事件冒泡、作用域、原型对象、影子DOM、严格模式等

1. 变量提升(Hoisting)

变量提升(Hoisting)

  • 从字面意思来看:
    • 指变量(和函数)的声明会被提升到代码的头部
  • 从运行结果来看:
    • 指变量(和函数)可以先被调用,再被声明

比如下面这段代码并不会报错:

console.log(a);
var a = 1;

因为JavaScript引擎在编译阶段会先解析代码,获取所有被声明的变量,并将其放入内存中,所以上述代码的运行结果等同于下面这段代码:

var a;
console.log(a);
a = 1;

因此会输出undefined,表示a已经被声明但未赋值。

注意:

  1. 实际上变量(和函数)的声明在代码里物理位置是不会动的,只是会先提取出来放在内存里。
  2. 函数和变量相比,会被优先提升。
  3. 提升的只是声明,如果想提前使用需要先初始化,即初始化和使用可以在声明之前。

2. 事件冒泡(Event Bubbling)

3. 作用域(Scope)

4. 原型对象(Prototype)

5. 影子DOM(Shadow DOM)

6. 严格模式(Strict Mode)

除了正常的运行模式之外,JavaScript还提供了另一种模式:严格模式(Strict Mode)。
严格模式是从ES5进入标准的,主要目的有以下几点:

  • 明确禁止一些不合理、不严谨的语法,减少JavaScript的一些怪异行为。
  • 增加更多报错的场合,通过抛出错误来消除了一些原有静默错误,消除代码运行的一些不安全之处,保证代码运行的安全。
  • 修复了一些导致JavaScript引擎难以执行优化的缺陷,提高编译器效率,增加运行速度。
  • 为未来新版本的JavaScript语法做好铺垫。

6.1 进入方式

使用'use strict';"use strict";即可进入严格模式。(比较老的引擎可能不支持,会当做普通字符串忽略掉)
'use strict';可以放在整个脚本的第一行,或者单个函数的第一行,则整个脚本或整个函数会按照严格模式执行。(严格地说,只要前面不是产生实际运行结果的语句,'use strict';可以不在第一行,比如直接跟在一个空的分号后面,或者跟在注释后面。)

注意:

  1. 严格模式必须从代码一开始就生效,否则不会进入严格模式。
  2. 合并严格模式和非严格模式的两个脚本时可能会出现问题,建议使用以下方法避免发生问题:
    1. 在函数级别开启严格模式。
    2. 将整个脚本放在一个立即执行的匿名函数中,再对脚本开启严格模式。

6.2 与正常模式的区别

6.2.1 部分静默错误改为显式报错

严格模式使得JavaScript的语法变得更严格,更多的操作会显式报错。其中有些操作,在正常模式下只会默默地失败,不会报错。

6.2.1.1 只读属性不可写

严格模式下,给只读属性赋值,或者删除不可配置(non-configurable)属性都会报错。

// 对只读属性赋值会报错
'use strict';
'abc'.length = 5;
// TypeError: Cannot assign to read only property 'length' of string 'abc'
'use strict';
Object.defineProperty({}, 'a', {
  value: 37,
  writable: false
});
obj.a = 123;
// TypeError: Cannot assign to read only property 'a' of object #<Object>

// 删除不可配置的属性会报错
'use strict';
var obj = Object.defineProperty({}, 'p', {
  value: 1,
  configurable: false
});
delete obj.p
// TypeError: Cannot delete property 'p' of #<Object>

6.2.1.2 只设置了取值器的属性不可写

6.2.1.3 禁止扩展的对象不可扩展

6.2.1.4 eval、arguments不可用作标识名

6.2.1.5 函数不能有重名参数

6.2.1.6 禁止八进制的前缀0表示法

6.2.2 增强的安全措施

6.2.2.1 全局变量必须显式声明

6.2.2.2 禁止this关键字指向全局变量

6.2.2.3 禁止使用fn.caller、fn.arguments

6.2.2.4 禁止使用arguments.callee、arguments.caller

6.2.2.5 禁止删除变量

6.2.3 静态绑定

6.2.4 向下一个版本过渡

7. 参考链接

  1. JavaScript的基本语法 - 网道
  2. 严格模式 - MDN
  3. 严格模式 - 网道

版权声明:本文为qq_43690043原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。