浅谈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() {
    //  ...
  }
    // ...
})();

 

 

posted on 2015-11-17 21:29  ChessZhang  阅读(3551)  评论(2编辑  收藏  举报

导航