• (81)Wangdao.com第十六天_JavaScript 严格模式


    严格模式

    除了正常的运行模式,JavaScript 还有第二种运行模式:严格模式(strict mode)。顾名思义,这种模式采用更加严格的 JavaScript 语法

    同样的代码,在正常模式和严格模式中,可能会有不一样的运行结果。

    一些在正常模式下可以运行的语句,在严格模式下将不能运行。

     

    • 设计目的
      • 早期的 JavaScript 语言有很多设计不合理的地方,但是为了兼容以前的代码,又不能改变老的语法,
      • 只能不断添加新的语法,引导程序员使用新语法
      • 严格模式是从 ES5 进入标准的,主要目的有以下几个。
        • 明确禁止一些不合理、不严谨的语法,减少 JavaScript 语言的一些怪异行为
        • 增加更多报错的场合,消除代码运行的一些不安全之处,保证代码运行的安全
        • 提高编译器效率,增加运行速度
        • 为未来新版本的 JavaScript 语法做好铺垫

     

    • 启用方法

    进入严格模式的标志,是一行字符串 use strict;

    • 'use strict';
      • 在整个脚本文件 启用
        • 放在脚本文件的第一行,整个脚本都将以严格模式运行。
        • <script>
              'use strict';
              console.log('这是严格模式');
          </script>
          
          <script> console.log('这是正常模式'); </script>
      • 只在单个函数中 启用
        • use strict; 放在函数体的第一行,则整个函数以严格模式运行

     

      • 有时,需要把不同的脚本合并在一个文件里面。
        • 如果一个脚本是严格模式,另一个脚本不是,它们的合并就可能出错。
          • 严格模式的脚本在前,则合并后的脚本都是严格模式
          • 如果正常模式的脚本在前,则合并后的脚本都是正常模式

     

        • 这时可以考虑把整个脚本文件放在一个立即执行的匿名函数之中
          (function () {
              'use strict';
              // some code here
          })();

     

    • 显示报错

    格模式使得 JavaScript 的语法变得更严格,更多的操作会显式报错

    其中有些操作,在正常模式下只会默默地失败,不会报错

      • 只读属性不可写
        • 严格模式下,设置字符串的 length 属性,会报错    // TypeError: Cannot assign to read only property 'length' of string 'abc'
        • 删除不可配置(non-configurable)属性都会报错

     

      • 禁止扩展的对象不可扩展
        • 严格模式下,对禁止扩展的对象添加新属性,会报错
          'use strict';
          var obj = {};
          Object.preventExtensions(obj);
          
          
          obj.v = 1;    // Uncaught TypeError: Cannot add property v, object is not extensible

     

      • 严格模式下,对一个只有取值器(getter)、没有存值器(setter)的属性赋值,会报错

     

      • eval、arguments 不可用作标识名

     

      • 函数不能有重名的参数

     

      • 禁止八进制的前缀0表示法

     

    • 增强的安全措施
      • 全局变量必须显式声明

     

      • 禁止 this 关键字指向全局对象

     

      • 函数禁止使用 fn.callee    fn.caller

     

      • 禁止使用 arguments.callee、arguments.caller
        • 只有对象的属性,且属性的描述对象的 configurable 属性设置为 true,才能被 delete 命令删除

     

      • 禁止删除window 的变量

     

    • 静态绑定
          • JavaScript 语言的一个特点,就是允许 “动态绑定”,
          • 即某些属性和方法到底属于哪一个对象,不是在编译时确定的,而是在运行时(runtime)确定的。
          • 某些情况下,只允许静态绑定。也就是说,属性和方法到底归属哪个对象,必须在编译阶段就确定。
          • 这样做有利于编译效率的提高,也使得代码更容易阅读,更少出现意外。

     

      • 禁止使用 with 语句
        • 因为with语句无法在编译时就确定,某个属性到底归属哪个对象,从而影响了编译效果

     

      • 创设 eval 作用域

        • 正常模式下,JavaScript 语言有两种变量作用域(scope):全局作用域和函数作用域
        • 严格模式创设了第三种作用域:eval作用域
        • eval 所生成的变量只能用于 eval 内部
          • (function () {
                'use strict';
                var x = 2;
                console.log(eval('var x = 5; x'))    // 5
                console.log(x)    // 2
            })()
        • 如果希望 eval 语句也使用严格模式,有两种方式
          • // 方式一
            function f1(str){
                'use strict';
                return eval(str);
            }
            
            f1('undeclared_variable = 1');    // 报错
            
            
            
            // 方式二
            function f2(str){
                return eval(str);
            }
            
            f2('"use strict";undeclared_variable = 1')     // 报错
        • arguments 不再追踪参数的变化 
          • 变量arguments代表函数的参数。严格模式下,函数内部改变参数与arguments的联系被切断了,两者不再存在联动关系

     

      • 非函数代码块不得声明函数

        • 只允许在全局作用域或函数作用域声明函数

     

      • 保留字
        • implements、interface、let、package、private、protected、public、static、yield等

     

    --------小尾巴 ________一个人欣赏-最后一朵颜色的消逝-忠诚于我的是·一颗叫做野的心.决不受人奴役.怒火中生的那一刻·终将结束...
  • 相关阅读:
    crt中文乱码
    idea使用git版本控制忽略部分文件
    Springboot配置redis连接池参数
    redis通过lua脚本实现分布式锁
    jodaTime的使用
    jmap的使用
    代理服务器没有响应解决方案
    C/C/C++中暂停调试的三种方法C++中暂停调试的三种方法
    C/C/C++中暂停调试的三种方法C++中暂停调试的三种方法
    四种常见的post请求中的参数形式
  • 原文地址:https://www.cnblogs.com/tianxiaxuange/p/9806763.html
Copyright © 2020-2023  润新知