javascript的use strict,使用严格模式

上一篇博文学习变量声明带var和不带的区别.搜索相关的文章. 引出了另一个概念.

"use strict" 使用严格模式

对于一个使用者而不是概念研究者,我觉得没有意义争论或者讨论严格模式存在意义我只想记住他的作用是怎样的.使用他之后会怎样.

  • 1. 怎么写?

首先严格模式可以写在整个脚本或模块中,也可以写在函数中.如果写在全局环境,可以直接在文件的第一句加入"use strict"就可以了. 但是如果这么写的话你就惨了.

假如你的文件引入其它脚本文件时. 假如其它脚本没有启用严格模式你将面临很多问题.

所以建议把严格模式写在函数中,写在函数内的第一句就可以了.

  • 2. 有什么用?
  1. 去除with关键字,使用严格模式后,with关键字会报错不支持
    with(){
    }

    这样的写法了.

  2. 防止意外的全局变量,也就是上一篇文章的. 这样不带var的声明变量也不可以了.
    a = 2;
  3. 函数中未定义或者为null的this不在指向全局变量.防止依赖函数中的默认this行为代码出错.
    //"use strict"
    this.color = "red";
    function sayColor() {
        console.log(this.color);
    }
    sayColor();
    sayColor.call(null);
    undefined
    undefined
    

    严格模式

    "use strict"
    this.color = "red";
    function sayColor() {
        console.log(this.color);
    }
    sayColor();
    sayColor.call(null);
        console.log(this.color);
                        ^
    TypeError: Cannot read property 'color' of undefined

    另一种情况

    "use strict"
    function Person(name) {
        this.name = name;
    }
    
    var me = Person("Nicholas");
    this.name = name;
                  ^
    TypeError: Cannot set property 'name' of undefined

    原型继承

    "use strict"
    function Person(name) {
        this.name = name;
    }
    
    var me = new Person("Nicholas");

    没有报错. 原来这样. this = _proto_ = prototype 这些属性都是在new 一个新的对象. 就是在原型继承的时候赋值的.

  4. 重命名变量会报错,这个不多说了,都理解.
  5. 安全的eval()
        //"use strict";
        var y = eval("var x=10;");
        console.log(x);  //10
        "use strict";
        var y = eval("var x=10;");
        console.log(x);
        console.log(x);
                    ^
    ReferenceError: x is not defined
  6. 禁止对只读属性赋值
       // "use strict";
        var person = {};
        Object.defineProperty(person, "name",{
            writable: false,
                value: "Nicholas"
        });
        person.name = "John";

    以上正确

        "use strict";
        var person = {};
        Object.defineProperty(person, "name",{
            writable: false,
                value: "Nicholas"
        });
    
        person.name = "John";

    报错:

    c:\Users\Feng Huang\WebstormProjects\MemberManagement\test4.js:13
        person.name = "John";
                    ^
    TypeError: Cannot assign to read only property 'name' of #<Object>

    提示只读属性不能赋值.