了解你使用的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() { // ... } // ... })();