了解你使用的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. printf的一个常用技巧

    acm 的题目经常要求输出最后面一位不能有空格: 用if语句显得代码难看: 实现如下: int a[5]={1,2,3,4,5}; for(int i=0;i<=4;i++) printf(&q ...

  2. Java Applet使用

    问题描述:       Java Applet使用   参考资料:      http://docs.oracle.com/javase/tutorial/deployment/applet/depl ...

  3. bzoj 2327 构图暴力判断+独立集个数

    首先我们可以处理出10^6以内的所有的勾股数,如果我们有2*i-1和2*j互质, 那么A=(2*i-1)*(2*i-1)+(2*i-1)*(2*j),B=2*j*j+(2*i-1)*(2*j)为互质 ...

  4. Js高程笔记->引用类型

    1 . Object 对象    2 . Array 对象 :       检测方法:ES5 : isArray       转换方法: toLocaleString , toString , val ...

  5. 1024: [SCOI2009]生日快乐

    暴力题,N<=10,没注意到平均分,读题真是.. 我们对于一个矩形分成两块进行搜.然后求较大值. ans=min(ans,max(dfs(x,y/n*i,i),dfs(x,y/n*(n-i),n ...

  6. 哪些问题困扰着我们?DevOps 使用建议

    [编者按]随着 DevOps 被欲来越多机构采用,一些共性的问题也暴露出来.近日,Joe Yankel在「Devops Q&A: Frequently Asked Questions」一文中总 ...

  7. POJ 2027

    #include<iostream> using namespace std; int main() { int time; cin>>time; int a; int b; ...

  8. Android内存泄漏问题(一)

    前言 不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露. 其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用, ...

  9. jenkins配置及使用中出现的问题

    安装中遇到的问题: 1.linux中最好用普通用户安装tomcat和jenkins,用普通用户启动tomcat,否则jenkins工作空间不会在普通用户下,而线上自动发布部署时,是不允许用root用户 ...

  10. poj3415 Common Substrings(后缀数组,单调栈 | 后缀自动机)

    [题目链接] http://poj.org/problem?id=3415 [题意] A与B长度至少为k的公共子串个数. [思路] 基本思想是将AB各个后缀的lcp-k+1的值求和.首先将两个字符串拼 ...