0
点赞
收藏
分享

微信扫一扫

什么是JS严格模式(use strict)?

什么是严格模式?

所谓JS的严格模式就是在js脚本(或函数)第一行代码添加 use strict 表达式,表示该脚本(或函数)启用了严格模式。它可以消除帮助我们消除JS语法中不严谨的的地方。

JS脚本启用严格模式:

    "use strict"; //第一行
    func();

    function func() {
        a = 666;  
    }

JS函数启用严格模式:

    func();
    function func() {
        "use strict";
        a = 666  
    }

虽然use strict是后增加的内容,但你可以放心在低版本浏览器中使用它,因为不支持JS严格模式的浏览器会自动忽略这条表达式,所以它不会给你添加新的麻烦。

严格模式解决了什么问题?

JS严格模式主要解决了使用未声明的变量从而‘意外的’全局变量问题、修改了全局this、限制修改作用域的方法等,还新增了一些关键字,以及一些其他的限制。

‘意外的’全局变量:

例如:我们在修改代码的时候常常需要新加一个变量,但时常会忘记声明直接使用。这在非严格模式是不会报错的,编译器在执行到这行代码的时,发现它没有声明会自动创建这个全局变量继续使用,这就造成了内存泄露问题。 但在严格模式下,编译器在执行到这行代码的时,发现它没有声明就会报错:‘编译错误 xx 未定义’,从而提醒我们去声明变量,避免了内存泄露。

    "use strict"; 
    func();
    function func() {
        a = '变量a 未定义';   // Uncaught ReferenceError: a is not defined
    }

全局执行的 this 指向undefined

严格模式中在全局下执行的 this不会指向全局对象,而是undefined;

    f();  //undefined
    function f(){ 
        "use strict";
        return this;
    } 

所以,使用构造函数时,如果忘了加new,会报错。

  function Foo(){
        "use strict";
        this.name = '张三';
  }
    var f = Foo ();  //报错

限制使用eval()、禁止使用with修改作用域

在严格模式下, eval()是限制使用的,虽然还保有其核心功能,但并不会修改它所在的作用域;

function foo(str) {
   "use strict";
   eval( str );  // 李四
   console.log( a ); // ReferenceError: a is not defined
}

var str = "var a = '张三', b = '李四';console.log(b);" 

foo(str);

在严格模式下,with是禁止使用的,使用会直接报错;

"use strict";
var obj = {};
obj.name= '张三';

with (obj) {
    name = '法外狂徒';
}
console.log(obj.name);  //Uncaught SyntaxError: Strict mode code may not include a with statement

注意:虽然在非严格模式下允许使用eval()、with修改作用域,但请避免使用它们,因为它们会带来很差的性能。

其他限制

不允许使用八进制不允许使用转义字符、变量名不能使用 "eval"和"arguments" 字符串、不允许变量重名、不允许对只读属性赋值、不允许删除函数等等

这里我们注意一下前两条就好,其他的我相信大家也不会那么干

新增保留字:

implements、interface、let、package、private、 protected、public、static、yield

结语

JS一直以来因为语法不够严谨,被人们所诟病,JS的严格模式一定程度上消除了一些不合理、不严谨的地方。

它保证了代码的安全运行,同时还提高了JS运行效率。

所以,你会用严格模式吗?

举报

相关推荐

0 条评论