欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

严格模式

程序员文章站 2022-05-01 22:51:56
...

本文根据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设置了一下保留字, 使用保留字作为变量会报错