资讯专栏INFORMATION COLUMN

"use strict"

FleyX / 1170人阅读

摘要:增强的安全措施禁止关键字指向全局对象使用构造函数时,如果忘了加,不再指向全局对象,而是报错。禁止八进制表示法整数第一位为,将报错。也就是说,不允许在非函数的代码块内声明函数。

"use strict"

全局变量显示声明

静态绑定:属性和方法到底归属哪个对象,在编译阶段就确定。

禁止使用with语句:因为with语句无法在编译时就确定属性到底归属哪个对象

创设eval作用域:正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。它所生成的变量只能用于eval内部。

增强的安全措施

禁止this关键字指向全局对象
使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。

function f(){
    "use strict";
    this.a = 1;
};
f();// 报错,this未定义

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

function f1(){
    "use strict";
    f1.caller; // 报错
    f1.arguments; // 报错
   }

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

显示报错
正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。

  "use strict";
  var o = {};
  Object.defineProperty(o, "v", { value: 1, writable: false });
  o.v = 2; // 报错

严格模式下,对一个使用getter方法读取的属性进行赋值,会报错。

  "use strict";

  var o = {

    get v() { return 1; }
  };
  o.v = 2; // 报错

严格模式下,对禁止扩展的对象添加新属性,会报错。

  "use strict";
  var o = {};
  Object.preventExtensions(o);
  o.v = 1; // 报错

严格模式下,删除一个不可删除的属性,会报错。

  "use strict";
  delete Object.prototype; // 报错

重名错误

对象不能有重名的属性:正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。

函数不能有重名的参数:正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取。严格模式下,这属于语法错误。

禁止八进制表示法:整数第一位为0,将报错。

arguments对象的限制

不允许对arguments赋值

"use strict";
  arguments++; // 语法错误
  var obj = { set p(arguments) { } }; // 语法错误
  try { } catch (arguments) { } // 语法错误
  function arguments() { } // 语法错误
  var f = new Function("arguments", ""use strict"; return 17;"); // 语法错误

arguments不再追踪参数的变化

function f(a) {

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

- 禁止使用arguments.callee
这意味着,你无法在匿名函数内部调用自身了。

  "use strict";
  var f = function() { return arguments.callee; };
  f(); // 报错

函数必须声明在顶层
将来Javascript的新版本会引入"块级作用域"。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

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

 10. 保留字
 严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。使用这些词作为变量名将会报错。

原文链接:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html


    

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85174.html

相关文章

  • 关于Javascript中的&quot;use strict&quot;的那些事

    摘要:作用范围这样都会应用上模式。如果你仅想在一个函数中使用的特性检查对象中的重复键这段代码会抛出一个错误因为出现了两次。未声明变量在模式下,给未声明的变量赋值会抛出的警告。重复的参数注意出现了两次,因此会抛出一个错误。 use strict作用范围 // file.js use strict function doStuff(){ // use strict is enabled ...

    icyfire 评论0 收藏0
  • 为什么使用&quot;use strict&quot;可以节约你的时间

    摘要:未声明变量你现在已经知道忘记在这个变量前面加了。想象一下,如果你声明了一个全局的,在嵌套循环中可能会引起混乱。重复的参数注意出现了两次,因此会抛出一个错误。限制函数中的现在你可以使用改变了参数,又节约了你的时间。 // file.js use strict function doStuff(){ // use strict is enabled here! } 这样挑的fil...

    hizengzeng 评论0 收藏0
  • let-us-koa - 快速玩转 koa 的最小化 web 应用 &quot;容器&quot;(脚

    摘要:搭建一个的脚手架并不困难,但就如其他体力活一样,我们并不想重复劳动其他脚手架生成出来的项目目录结构可能并不是我们想要的一些基于和类型的框架型项目集成了等重量级组件,当然,这本身无可厚非,大家的定位不一样我希望只通过一个最小化的容器去 Github Repo: https://github.com/qddegtya/let-us-koa showImg(https://segmentfa...

    史占广 评论0 收藏0
  • 【js细节剖析】通过&quot;=&quot;操作符为对象添加新属性时,结果会受到原型链上的同名属性

    摘要:在使用的过程中,通过操作符为对象添加新属性是很常见的操作。但是,这个操作的结果实际上会受到原型链上的同名属性影响。通过它,可以做到操作符做不到的事情,比如为对象设置一个新属性,即使它的原型链上已经有一个的同名属性。 在使用JavaScript的过程中,通过=操作符为对象添加新属性是很常见的操作:obj.newProp = value;。但是,这个操作的结果实际上会受到原型链上的同名属性...

    wemallshop 评论0 收藏0

发表评论

0条评论

阅读需要支付1元查看
<