zoukankan      html  css  js  c++  java
  • 浅谈ES5的const以及strict mode

    了解你使用的JavaScript版本是很重要的,因为不同版本的JavaScript对某些语法或者特性的支持情况是不一样的,下面就来举一些例子来说明一下。首先来看一下const关键字,学过比如Java,c等语言的都知道,这是一个声明常量的关键字。他是ES5引入来的一个新标准。但是在ES3版本,他是不被支持的。就目前而言,依然有一些浏览器对他并不完全支持的,会把它当成var关键字对待,如下:
    // 有些环境下它是不可以改变的
    const PI = 3.141592653589793;
    PI = "modified!";
    PI; // 3.141592653589793
        
    //某些环境下,可能会把它当成var关键字对待
    const PI = 3.141592653589793;
    PI = "modified!";
    PI; // "modified!"
    所以,我们在使用const时候,需要特别注意他在不同的环境下的行为。
     
    再如:strict mode(严格模式),这也是ES5新增了的语法,语法如下:
    "use strict";
    
    如果在一些老的浏览器里,这行代码不会有任何影响,它就相当于是一个普通的字符串。但是,如果在新的浏览器,它就会起作用了,他会使该作用域处于严格模式,严格模式一些特性大家可以参考一下阮一峰老师的博客:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html,这里就不详细介绍了。一般的,我们把“use strict”写在需要启用严格模式函数里面的第一行,如下:
    function f(x) {
        "use strict";
        // ...
    }
    使用了严格模式有哪些影响呢?这里举个例子吧,如果一个函数启用了严格模式,它的arguments是不可以重新定义的,否则将会报错,如下:
    function f(x) {
        "use strict";
        var arguments = []; // error: redefinition of arguments
        // ...
    }
    再次强调一下,"use strict"只能写在函数的第一行,如果你不写在第一行的话,他就会不起任何作用。还有,千万不能够把它写在函数的外面(即全局作用域),因为,那样将会使得所有的文件都处于严格模式,这导致的结果往往不是我们想要的。下面来看一个例子:
     
    假设有两个js文件,分别是file1.js,和file2.js。
     
    在file1.js文件里面启用了严格模式,他的代码如下:
    // file1.js
    "use strict";
    function f() {
        // ...
    }
    // ...
    file2.js是不希望启用严格模式的,因为里面的一个名字为g的函数重新定义了arguments(我们刚刚举了例子了,严格模式下,arguments是不可以重新定义的,但是非严格模式是允许的),file2.js的代码如下:
    //and another file that expects not to be in strict mode:
    // file2.js
    // no strict-mode directive
    function g() {
    var arguments = [];
        // ...
    }
    // ...
     
    假如,我们把file1.js和file.js都引入了项目里,会发生什么情况呢?
     
    首先,我们假设先引入file1.js文件的话,再引入file2.js的话,如下:
    <script src="js/file1.js"></script>
    <script src="js/file2.js"></script>
     
    那么,这时候,两个文件都引入之后,合并起来就是下面的样子的:
    // file1.js
    "use strict";
    function f1() {
        // ...
    }
    // ...
    // file2.js
    // no strict-mode directive
    function g() {
        var arguments = []; // error: redefinition of arguments
        // ...
    }
    // ...
    因为“use strict”写在了第一行,所以这时候整个作用域处于严格模式。但是file2.js里面的代码是不希望启用严格模式的,所以这时候g函数就会报错了。
     
    再假如,我们首先引入来的是file2.js文件,那么合并后的文件应该是下面的样子:
    // file2.js
    // no strict-mode directive
    function g() {
        var arguments = [];
        // ...
    }
    // ...
    // file1.js
    "use strict";
    function f() { // no longer strict
        // ...
    }
    // ...
    因为这时候,“use strict”不是写在第一行,所以它将不起任何作用。但是,这与本来的意图相违背了,因为,file1.js里面的代码本来是希望启用严格模式的。
     
    综上所述,我们最好把“use strict”写在函数体里面,而且必须写在函数体的第一行。如果,很多函数都用到严格模式的话,每个函数都要添加“use strict”确实有点麻烦,这时候,我们可以使用立即执行函数把所有的代码包起来,如下:
    (function() {
        "use strict";
    
        function f() {
            // ...
        }
    
      function g() {
        //  ...
      }
        // ...
    })();
     
  • 相关阅读:
    HDU 2586 How far away?
    UVAlive 5796 Hedge Mazes
    HDU 4975 A simple Gaussian elimination problem.
    Poj 1149 PIGS
    HDU 3416 Marriage Match IV
    HDU 4912 Paths on the tree
    HDU 3277 Marriage Match III
    終於記起了帳號密碼
    codeforces194a
    codeforces195c
  • 原文地址:https://www.cnblogs.com/yugege/p/4972911.html
Copyright © 2011-2022 走看看