灏天阁

严格模式

· Yin灏

严格模式

  1. 消除了 JS 语法的一些不合理、不严谨,减少一些怪异行为。
  2. 消除代码运行的一些不安全之处,保证代码运行的安全。
  3. 提高编译器效率,增加运行速度。
  4. 禁用了在 ECMAScript 的未来版本中可能会定义的一些语法,为未来新版本的 Js 做好铺垫,比如一些保留字如:class、enum、export、extends、import、super 不能做变量名。

开启严格模式

严格模式可以应用到整个脚本或个别函数中。

  1. 为脚本开启严格模式
  2. 为函数开启严格模式

严格模式中的变化

  1. 变量规定

变量必须先声明才能使用。

'use strict';
num = 10;
console.log(num); // error
  1. 严禁删除已经声明变量,例如:delete x; 语法是错误的。
'use strict';
var num = 10;
delete num; // error
  1. 严格模式下 this 指向问题
  • 以前在全局作用域函数中的 this 指向 window 对象,严格模式下全局作用域中函数中的 this 是 undefined。
'use strict';
function fn() {
	console.log(this);
}
fn(); // undefined
  • 以前构造函数时不加 new 也可以调用,当普通函数,this 指向全局对象,严格模式下,如果构造函数不加 new 调用,this 会报错;new 实例化的构造函数指向创建的对象实例。
// 非严格模式下
function fn() {
	this.sex = '男';
}
fn();
console.log(window.sex); // 男

// 严格模式下报错
'use strict';
function fn() {
	this.sex = '男';
}
fn(); // error

// 正常实例化
'use strict';
function Fn() {
	this.sex = '男';
}
var f = new Fn();
console.log(f.sex); // 男
  1. 定时器 this 还是指向 window 没有变化
// 严格模式下
'use strict';
setTimeout(function() {
	console.log(this); // window
}, 2000)
  1. 事件、对象还是指向调用者
  2. 函数不能有重名的参数
// 严格模式下
'use strict';
function fn(a, a) {
	console.log(a + a);
}
fn(1, 2); // error
  1. 不允许在非函数的代码内声明函数
// 严格模式下
'use strict';

if(true) {
	function f() { } // 语法错误
	f();
}

for(var i = 0; i < 5; i++) {
	function f2() {}  // 语法错误
	f2();
}

function baz() { // 合法
	function eit() {} // 合法
}

- Book Lists -