严格模式use strict

JavaScript是一个弱类型语言,这其实跟JavaScript建立之初有关系。当时JavaScript的做者只是随便写一个语言来临时使用,鬼知道JavaScript会在今天这么有地位。浏览器

有业界大牛说JavaScript是如今开发语言里面最差的,不能否认,越是约束少的语言,真正面对大型项目的时候越是容易出现问题。其实JavaScript有不少不合理不严谨甚至是糟糕的机制。好比没有做用域、重复声明变量、可选的分号等等,都是被人诟病地方。安全

随着JavaScript应用的愈来愈多,ECMAScript慢慢的也定制了一些标准来改进JavaScript的缺陷,好比ES6的let、const、module、class等。而早在ES5就提出了第二种运行模式严格模式,就是但愿开发者能慢慢的脱离马虎模式/稀松模式/懒散模式(sloppy)模式。函数

严格模式的目的:优化

消除JavaScript语法不合理不严谨的地方,减小奇怪的行为。this

消除代码运行不安全的地方。cdn

提升编译效率和运行速度。对象

为将来作铺垫。ip

严格模式IE10以上和各大浏览器都已经支持,要注意的是,相同代码在严格模式和非严格模式下运行获得的结果会有不一样。主要仍是增长了不少静默抛出异常。作用域

使用:"use strict"开发

能够在整个js开头声明,也能够在函数里面声明:

或者:

function fn() {

"use strict";

}

严格模式下的改进:

没有声明a,直接a = 10报错,这意味着拼写错误的变量直接报错。

对只读属性、getter属性赋值,对禁止扩展的对象添加新属性,删除不可删除的属性都会抛出异常。

对象有重名属性、函数参数重名,正常是后面覆盖以前的,严格模式下是语法错误、会报错。

禁止了八进制表示法

ECMAScript 6中的严格模式禁止设置primitive值的属性.不采用严格模式,设置属性将会简单忽略(no-op),采用严格模式,将抛出TypeError错误。这个我还真不理解。

严格模式简化了代码中变量名字映射到变量定义的方式,JavaScript有些状况会使得代码中名字到变量定义的基本映射只在运行时才产生. 严格模式移除了大多数这种状况的发生, 因此编译器能够更好的优化严格模式的代码:

禁止使用with:

with所引发的问题是块内的任何名称能够映射(map)到with传进来的对象的属性, 也能够映射到包围这个块的做用域内的变量(甚至是全局变量), 这一切都是在运行时决定的: 在代码运行以前是没法得知的。

建立eval做用域:

在正常模式下, 代码 eval("var x;") 会给上层函数或者全局引入一个新的变量 x 。这意味着, 通常状况下, 在一个包含 eval 调用的函数内全部没有引用到参数或者局部变量的名称都必须在运行时才能被映射到特定的定义 (由于 eval 可能引入的新变量会覆盖它的外层变量)。在严格模式下 eval 仅仅为被运行的代码建立变量, 因此 eval 不会使得名称映射到外部变量或者其余局部变量。

没法删除变量。只有configurable设置为true的对象属性,才能被删除。

var a = 10;

delete a;//报错

严格模式下更容易写出“安全”的JavaScript

禁止this执行全局对象:

function fn() {

"use strict";

console.log(this);}

fn()//undefinednew fn()指向window

禁止函数内部遍历调用栈:

function fn() {

"use strict";

console.log(fn.arguments);

console.log(fn.caller);

}

fn()//报错

Arguments不能赋值,也不会追踪参数变化:

function fn(a) {

a = 20;

console.log(arguments[0]);

}

fn(10)

严格模式输出10,非严格模式输出20。

严格模式下的arguments不会再提供访问与调用这个函数相关的变量的途径,也就是禁用arguments.callee

函数声明必须在顶层,也就是说只能在全局或者函数做用域内声明函数,在if或者for循环里面不能声明函数,不然报错。

为将来的ECMAScript版本铺平道路,增长了一些保留字,也就是不能用来声明变量的关键字,不能再用这些名字做为变量名或者形参名:

implements, interface, let, package, private, protected, public, static, yield,class, enum, export, extends, import, super等

相关文章
相关标签/搜索