严格模式

本文根据JavaScript标准教程-阮一峰 整理笔记

严格模式是ES5标准提出来的, 有以下几个目的:

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

严格模式下的代码比正常模式下的代码更加严格, 某些代码在正常模式下不会报错, 但是在严格模式下会报错。

我们可以使用'use strict';方法在代码中启用。 它既可以在整个js文件中启用, 也可以在函数中启用。
在js文件中启用时, 必须在文件的第一行写上'use strict;'
在函数中启用时, 必须在函数内的第一行写上'use strict;'

显示报错

  • 只读属性不可写
    字符串length属性是只读属性, 在严格模式下设置length属性会报错, 正常模式下则不会。
    删除只读属性或者删除不可配置属性也会报错

  • 只设置了取值器的属性不可写
    严格模式下,对一个只有取值器(getter)、没有存值器(setter)的属性赋值,会报错

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

  • evalarguments不可用作标识名

  • 函数不能有重名的参数

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

增强的安全措施

  • 全局变量必须显示声明

  • 禁止this关键字指向全局对象
    严格模式下, this指向的是undefined

function f() {
  'use strict';
  console.log(this === undefined);
}
f() // true

function f() {
  'use strict';
  this.a = 1;
};

f();// 报错,this 未定义
  • 禁止使用fn.caleefn.caller方法

  • 禁止使用arguments.callee, arguments.caller

  • 禁止删除变量
    若删除变量会报错,只有对象的属性,且属性的描述对象的configurable属性设置为true,才能被delete命令删除

'use strict';
var x;
delete x; // 语法错误

var obj = Object.create(null, {
  x: {
    value: 1,
    configurable: true
  }
});
delete obj.x; // 删除成功

静态绑定

  • 禁止使用with语句

  • eval作用域
    正常模式下eval作用域取决于它所处的执行环境
    严格模式下 , eval本省就是一个作用域

(function () {
  'use strict';
  var x = 2;
  console.log(eval('var x = 5; x')) // 5
  console.log(x) // 2
})()    //由于eval语句内部是一个独立作用域,所以内部的变量x不会泄露到外部
  • arguments不在追踪参数的变化
function f(a) {
  a = 2;
  return [a, arguments[0]];
}
f(1); // 正常模式为[2, 2]

function f(a) {
  'use strict';
  a = 2;
  return [a, arguments[0]];
}
f(1); // 严格模式为[2, 1]

向下一个版本的JavaScript过渡

  • 非函数代码块不得声明函数
'use strict';
if (true) {
  function f1() { } // 语法错误
}

for (var i = 0; i < 5; i++) {
  function f2() { } // 语法错误
}
  • 保留字
    JavaScript设置了一下保留字, 使用保留字作为变量会报错

猜你喜欢

转载自blog.csdn.net/helloyongwei/article/details/80248546