zoukankan      html  css  js  c++  java
  • 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:UsersFeng HuangWebstormProjectsMemberManagement	est4.js:13
          person.name = "John";
                      ^
      TypeError: Cannot assign to read only property 'name' of #<Object>

      提示只读属性不能赋值.

  • 相关阅读:
    KVM克隆CentOS6虚拟机后无法启动
    Python socket网络模块
    LNMP的安装--详细版
    CentOS7 二进制安装MySQL5.6.42
    超越线程池:Java并发并没有你想的那么糟糕
    有哪些实用的计算机相关技能,可以在一天内学会?
    如何写出让hr一看就约你面试的简历
    五个最佳编程字体
    Eclipse 的 Debug 介绍与技巧
    Redis时延问题分析及应对
  • 原文地址:https://www.cnblogs.com/dangkei/p/4891265.html
Copyright © 2011-2022 走看看