了解你使用的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. udp 视频包网络传输花屏

    视频数据传输在传输层可以选择TCP或者UDP,TCP面向连接,传输中断,发送端是知道的.TCP传输的好处是不丢包,坏处是网络不太好的情况下会越堵越严重.UDP非面向连接,发送端只管发送数据,接收端有没 ...

  2. boost之bind

    bind1st bind2nd在stl里面有具体的实现,只是只能绑定两个参数. boost里面的bind使用bind(Fun f,A1 a1,A2,a2...)产生一个对象,这个对象可以有占位符,可以 ...

  3. 【BZOJ】【1020】【SHOI2008】安全的航线flight

    计算几何/二分/迭代/搜索+剪枝 写三个tag可能是因为从哪个方向来理解都可以吧…… 我完全不会计算几何所以抄了ydc的代码 题解:http://ydcydcy1.blog.163.com/blog/ ...

  4. 通过HTTP访问网络资源

    添加访问网络的权限:<uses-permission android:name="android.permission.INTERNET"/> package com. ...

  5. NYOJ-32 组合数 AC 分类: NYOJ 2013-12-30 07:42 189人阅读 评论(0) 收藏

    #include<stdio.h> int num[100]; int pnum(int n,int v); int mv=0; int main(){ int n,v; scanf(&q ...

  6. ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify

    首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...

  7. maven 常用5个命令

    1. mvn help:describe 你是否因为记不清某个插件有哪些goal而痛苦过,你是否因为想不起某个goal有哪些参数而苦恼,那就试试这个命令吧,它会告诉你一切的. 参数: 1. -Dplu ...

  8. vi/vim使用指北 ---- Beyond the Basic

    更多的组合命令 [number]-[command]-[test object] number:   数字 comand:  c,d,y  (修改,删除,复制) test object: 移动光标的命 ...

  9. cf 383 D

    D. Antimatter time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  10. Andoid自动判断输入是电话,网址或者Email的方法----Linkify的应用!

    本节要讲的是,当我们在一个EditText输入电话或者网址还是Email的时候,让Android自动判断,当我们输入的是电话,我们点击输入内容将调用打电话程序,当我们输入是网址点击将打开浏览器程序.而 ...