淺談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() {
    //  ...
  }
    // ...
})();

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM