0%

ES5为Javascript添加了第二种运行模式:严格模式。这使得Javascript在更严格的条件下运行。

设立严格模式的目的:

  • 消除JavaScript语法的一些不合理,不严谨之处,减少一些怪异行为。
  • 消除代码运行的一些不安全之处,保证代码运行的安全。
  • 提高编译器效率,增加运行速度。
  • 为未来新版本的JavaScript做好铺垫。

进入严格模式的标志:

“use strict”

ps:ES6的模块自动采用严格模式,不管有没有使用'use strict'

严格模式可以用于整个JavaScript脚本或者单个函数。如果将'use strict'放在脚本的第一行,则整个脚本都将以严格模式运行,将'use strict'放在函数的第一行,则整个函数以严格模式运行。

作为一个前端开发人员,弄清楚JavaScript的执行上下文有助于我们理解js中一些晦涩的概念,比如闭包,作用域,变量提升等等。

执行栈

执行栈用于存储代码执行期间创建的所有执行上下文。具有FILO接口,也被称为调用栈。

当JavaScript代码被运行的时候,会创建一个全局上下文,并push到当前执行栈。之后当发生函数调用的时候,引擎会为函数创建一个函数执行上下文并push到栈顶。引擎会先执行调用栈顶部的函数,当函数执行完成后,当前函数的执行上下文会被移除当前执行栈。并移动到下一个上下文。

JavaScript中奇怪的一点是你可以在变量和函数声明之前使用它们。就好像是变量声明和函数声明被提升了代码的顶部一样。

1
2
3
4
5
6
7
8
9
sayHi() // Hi there!

function sayHi() {
console.log('Hi there!')
}

name = 'John Doe'
console.log(name) // John Doe
var name

然而JavaScript并不会移动你的代码,所以JavaScript中“变量提升”并不是真正意义上的“提升”。

JavaScript是单线程语言,所以执行肯定是按顺序执行。但是并不是逐行的分析和执行,而是一段一段地分析执行,会先进行编译阶段然后才是执行阶段。

在编译阶段阶段,代码真正执行前的几毫秒,会检测到所有的变量和函数声明,所有这些函数和变量声明都被添加到名为Lexical Environment的JavaScript数据结构内的内存中。所以这些变量和函数能在它们真正被声明之前使用。

undefinednull都是javascript中原始数据类型,并且ECMAScript认为undefined相等于null

1
undefined == null   // true

JavaScript最初设计null表示一个“无”的对象,转换数值是为0。undefined是一个表示”无”的原始值,转为数值时为NaN。

1
2
3
4
Number(null)    // 0
Number(undefined) // NaN

null == 0 // false

vi编辑器是所有Unix及Linux系统下标准的编辑器。 vim 是 vi 的升级版本,不仅兼容 vi 的所有指令,还新增了一些新的特性

虽然 vim 的学习曲线相对于其他的编辑器来说非常的陡峭,但是当你熟悉了 vim 的这种开发模式后,你会发现你真的有种离不开 vim 的感觉。