函数的严格模式

来源:互联网 发布:淘宝的支付转化率指数 编辑:程序博客网 时间:2024/06/07 10:05

严格模式

从 ES5 开始,函数内部可以设定为严格模式。使用 'use strict' 声明。
贴上百度的严格模式好处:

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

“严格模式”体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。
另一方面,同样的代码,在”严格模式”中,可能会有不一样的运行结果;一些在”正常模式”下可以运行的语句,在”严格模式”下将不能运行。掌握这些内容,有助于更细致深入地理解Javascript,让你变成一个更好的程序员。

严格模式和普通模式的区别:

  • 不允许用with。
  • 所有变量必须声明,赋值给未声明的变量报错,而不是隐匿创建全局变量。
  • eval中的代码不能创建eval所在作用域下的变量、函数。而是为eval单独创建一个作用域,并在eval返回时丢弃。
  • 函数中的特殊对象arguments是静态副本,而不像非严格模式那样,修改arguments或修改参数变量会相互影响。
  • 删除configurable=false的属性时报错,而不是忽略。
  • 对象字面量重复属性名报错。
  • 禁止八进制字面量,如010(八进制的8)。
  • 严格模式下eval、arguments变为关键字,不能用作变量名。
  • 一般函数调用时(不是对象的方法调用,也不使用apply/call/bind等修改this)this指向null,而不是全局变量。
  • 试图修改不可写属性(writable=false),在不可扩展的对象上添加属性时报TypeError,而不是忽略。
  • arguments.caller,arguements.callee被禁用

ES2016 做了一点修改,规定只要函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式,否则会报错。

// 报错function doSomething(a, b = a) {  'use strict';  // code}// 报错const doSomething = function ({a, b}) {  'use strict';  // code};// 报错const doSomething = (...a) => {  'use strict';  // code};const obj = {  // 报错  doSomething({a, b}) {    'use strict';    // code  }};

两种方法可以规避这种限制。第一种是设定全局性的严格模式,这是合法的。

'use strict';function doSomething(a, b = a) {  // code}

第二种是把函数包在一个无参数的立即执行函数里面。

const doSomething = (function () {  'use strict';  return function(value = 42) {    return value;  };}());
阅读全文
0 0
原创粉丝点击