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

最新文章

  1. Android之使用个推实现三方应用的推送功能
  2. 《Linux内核分析》之第四章读书笔记
  3. 「个人vim插件+配置」
  4. 影响 PHP 行为的扩展和网络函数
  5. php部分---注册审核
  6. 20151214下拉列表:DropDownList
  7. java\c程序的内存分配
  8. Android利用数据库传送数据
  9. Jmeter笔记2:参数化(五种方法)
  10. #!---&gt;hashbang技术
  11. 【php】中【event】之实现方式
  12. grep 和 sed:linux经常使用工具 &amp;amp; 基本正則表達式
  13. phpcms 模板常用标签指南
  14. 微信公众平台快速开发框架 For Core 2.0 beta &ndash;JCSoft.WX.Core 5.2.0 beta发布
  15. node 创建
  16. SQL MID() 函数
  17. 随机获得id的方法
  18. poj 3468 A Simple Problem with Integers(线段树区间更新)
  19. 在java1.8下使用jetty报错java.lang.CharSequence cannot be resolved
  20. Bootstrap的Model源码详细注释 (转)

热门文章

  1. 【Binary Tree Level Order Traversal】cpp
  2. 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串&quot;+100&quot;,&quot;5e2&quot;,&quot;-123&quot;,&quot;3.1416&quot;和&quot;-1E-16&quot;都表示数值。 但是&quot;12e&quot;,&quot;1a3.14&quot;,&quot;1.2.3&quot;,&quot;+-5&quot;和&quot;12e+4.3&quot;都不是。
  3. 【BZOJ】【1986】【USACO 2004 Dec】/【POJ】【2373】划区灌溉
  4. Facebook
  5. js获取,设置FCKeditor内容
  6. Python:异常处理
  7. 无网络centos7中部署kubernetes
  8. 用VBS将PPT转为图片
  9. 由浅入深了解Thrift之客户端连接池化
  10. POJ 2891 Strange Way to Express Integers (解一元线性方程组)