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

浅谈ES5的const以及strict mode的更多相关文章

  1. ES6 浅谈let与const 块级作用域之封闭空间(闭包)

    ES6新增了 let const 命令,用来声明变量.它的用法类似于 var  ,但是所声明的变量,只在 let const 命令所在的代码块内有效.  var const 不允许重复声明 用处: 可 ...

  2. 浅谈ES5和ES6继承和区别

    最近想在重新学下ES6,所以就把自己学到的,记录下加强下自己的理解 首先先简单的聊下ES5和ES6中的继承 1.在es5中的继承: function parent(a,b){ this a = a; ...

  3. 浅谈es5和es6中的继承

    首先给大家介绍下在es5中构造函数的继承 function A(){ 2 //构造函数A 3 this.name="我是A函数"; 4 } 5 6 A.prototype={ 7 ...

  4. 浅谈JavaScript严格模式(use strict)

    "use strict" 的目的是指定代码在严格条件下执行. 严格模式下你不能使用未声明的变量. 严格模式声明 严格模式通过在脚本或函数的头部添加 "use strict ...

  5. 浅谈在ES5环境下实现const

    最近看到一个面试题--用ES5实现const.作为JS初学者的笔者知道在ES6中有const命令,可以用来声明常量,一旦声明,常量的值就不可改变.例如: 1234567891011 const Pi ...

  6. 浅谈JS中 var let const 变量声明

    浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...

  7. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  8. 浅谈Vue响应式(数组变异方法)

    很多初使用Vue的同学会发现,在改变数组的值的时候,值确实是改变了,但是视图却无动于衷,果然是因为数组太高冷了吗? 查看官方文档才发现,不是女神太高冷,而是你没用对方法. 看来想让女神自己动,关键得用 ...

  9. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

随机推荐

  1. The income statement

    The income statement measures performance over some period  of time,usually a quarter or a year.The ...

  2. Log4j2 配置笔记(Eclipse+maven+SpringMVC)

    Log4j2相关介绍可以百度看下,这里只注重配置Log4j2 能够马上跑起来: 1.pom.xml文件中添加Log4j2的相关Maven配置信息 <!-- log4j2 --> <d ...

  3. 圆形DIV

    <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" ...

  4. 高效SQL语句(SQL Server)

    以下的SQL语句以Northwind为例 1.不要再where子句中"="的左侧使用函数和表达式,因为系统无法应用函数或表达式中的索引 SELECT * FROM Customer ...

  5. extjs4与ckeditor、ckfinder整合

    <script type="text/javascript"src="<?php echo Yii::app()->request->baseUr ...

  6. JavaScript之substring()方法讲解

    定义和用法 substring() 方法用于提取字符串中介于两个指定下标之间的字符. 语法 stringObject.substring(start,stop) 参数 描述 start 必需.一个非负 ...

  7. .NET设计模式(16):模版方法(Template Method)(转)

    摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Te ...

  8. PowerDesigner(九)-模型文档编辑器(生成项目文档)(转)

    模型文档编辑器 PowerDesigner的模型文档(Model  Report)是基于模型的,面向项目的概览文档,提供了灵活,丰富的模型文档编辑界面,实现了设计,修改和输出模型文档的全过程. 模型文 ...

  9. uiview 单边圆角或者单边框

    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(120, 10, 80, 80)]; view2.backgroundColor = ...

  10. POJ 3279

    Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3062   Accepted: 1178 Descript ...