浅谈JS严格模式

简介

何为严格模式?严格模式(strict mode)即在严格的条件下运行,在严格模式下,很多正常情况下不会报错的问题语句,将会报错并阻止运行。

但是,严格模式可以显著提高代码的健壮性,比如JS经常被人诟病的隐式创建全局变量,在严格模式下就会阻止运行。

总的来说,引入严格模式虽然会导致一些代码不可运行,但是,严格模式使得一些JS广受诟病的问题无法运行,从长期角度上看,绝对是利大于弊。

用法

进入严格模式的方法很简单,只需要在在需要进入严格模式的作用域开头输入"user strict"即可,值得一提的是,在无法执行严格模式的旧版浏览器中(IE10之前),该条指令会自动被忽略。

例1:

"user strict";
x = 1; // Uncaught ReferenceError: x is not defined

如例1所示,在全局作用域的开头定义了严格模式,并隐式定义了全局变量xx = 1 这条语句在严格模式下,抛出了异常,提示没有显式创建变量a

例2:

"use strict";
fn(); function fn () {
x = 1; // Uncaught ReferenceError: x is not defined
}

在例2中,由于严格模式定义在全局作用域中,而fn作用域被全局作用域所包含,所以fn作用域中同样执行了严格模式。

注:也可以通过执行上下文栈来解释。

例3:

x = 1;
fn(); function fn () {
"use strict"
y = 2; // Uncaught ReferenceError: y is not defined
}

在例3中,由于严格模式只定义在fn函数的局部作用域中,在全局作用域中不起作用,所以全局作用域中,隐式定义全局变量x没有抛出异常,而在局部作用域中,隐式定义全局变量y抛出异常。

规则

1.严格模式下无法隐式创建全局变量

2.严格模式会使引起静默失败(silently fail,注:不报错也没有任何效果)的赋值操做抛出异常

"use strict";

// 给不可写属性赋值
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // 抛出TypeError错误 // 给只读属性赋值
var obj2 = { get x() { return 17; } };
obj2.x = 5; // 抛出TypeError错误 // 给不可扩展对象的新属性赋值
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // 抛出TypeError错误

3.在严格模式下,试图删除不可删除的属性时,会抛出异常(之前这种操作不会产生任何效果)

"use strict";
delete Object.prototype; // 抛出TypeError错误

4.在严格模式下,不允许重名属性

"use strict";
var o = { p: 1, p: 2 }; // 语法错误

5.严格模式要求函数参数名唯一

function sum(a, a, c){ // 语法错误
"use strict";
return a + a + c; // 代码运行到这里会出错
}

6.禁止八进制数字语法

"use strict";
var sum = 015 + // 语法错误
197 +
142;

7.禁止设置原始类型(primitive)值的属性

(function() {
"use strict"; false.true = ""; //TypeError
(14).sailing = "home"; //TypeError
"with".you = "far away"; //TypeError })();

8.禁用with

9.严格模式下,eval()创建变量不能被调用

"use strict";
eval ("var x = 2");
alert (x); // Uncaught ReferenceError: x is not defined

10.严格模式禁止删除声明变量

"use strict";

var x;
delete x; // 语法错误 eval("var y; delete y;"); // 语法错误

11.不能使用evalarguments字符串

"use strict";
var arguments = 1; // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
var eval = 2; // Uncaught SyntaxError: Unexpected eval or arguments in strict mode

12.严格模式下,函数的 arguments 对象会保存函数被调用时的原始参数。arguments[i] 的值不会随与之相应的参数的值的改变而变化,同名参数的值也不会随与之相应的 arguments[i] 的值的改变而变化。

13.不再支持arguments.callee

"use strict";
var f = function() { return arguments.callee; };
f(); // TypeError

14.保留部分关键字,这些字符包括implements, interface, let, package, private, protected, public, staticyield。在严格模式下,你不能再用这些名字作为变量名或形参名。

15.禁止this指向全局对象,当this指向全局对象时,自动转为undefined

总结

随着JS的飞速发展,出现了一大堆可以代替严格模式的工具,比如eslint等,但是,当你想要提升原生JS代码的健壮性和可读性,回避JS一些被人诟病的语法,严格模式是你不二的选择。

浅谈JS严格模式的更多相关文章

  1. 浅谈 js 字符串 search 方法

    原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是 ...

  2. 浅谈JS面向对象

    浅谈JS面向对象 一 .什么是面向过程 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了.注重代码的过程部分. 二.什么是面向对象 最先出现在管理学 ...

  3. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  4. 浅谈JS之AJAX

    0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...

  5. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  6. 浅谈 js 正则字面量 与 new RegExp 执行效率

    原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化 ...

  7. 浅谈 js 字符串之神奇的转义

    原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...

  8. 浅谈 js 正则之 test 方法

    原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. var re = /\d/; console. ...

  9. 浅谈 js 数字格式类型

    原文:浅谈 js 数字格式类型 很多人也许只知道 ,123.456,0xff 之类的数字格式.其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有人说这是 ...

随机推荐

  1. 佛祖保佑永无bug

    世界最难懂C语言代码竞赛: // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |) // O\ = /O // ____/`---'\_ ...

  2. cocos2d-x游戏引擎核心之八——多线程

    一.多线程原理 (1)单线程的尴尬 重新回顾下 Cocos2d-x 的并行机制.引擎内部实现了一个庞大的主循环,在每帧之间更新各个精灵的状态.执行动作.调用定时函数等,这些操作之间可以保证严格独立,互 ...

  3. 《转》python学习(8)元组

    转自 http://www.cnblogs.com/BeginMan/p/3156235.html 一.元组特性 1.类似列表,但不可变类型,正因如此,它可以做一个字典的key2.当处理一组对象时,这 ...

  4. ubuntu下nginx编译安装

    安装依赖库: sudo apt-get install libgd2-xpm sudo apt-get install libgd2-xpm-dev sudo apt-get install libg ...

  5. linux :故障提示:Error:No suitable device found: no device found for connection "System eth0"

    解决:1./etc/udev/rules.d/70-persistent-net.rules 中的mac地址2.网卡配置文件ifcfg-eth0中的mac地址3.ifconfig中的mac地址以上三个 ...

  6. chinese-typesetting:更好的中文文案排版

    欢迎指正.GitHub 地址:https://github.com/jxlwqq/chinese-typesetting 更好的中文文案排版 统一中文文案.排版的相关用法,降低团队成员之间的沟通成本, ...

  7. pta习题集5-16 朋友圈

    某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友"这个推论可以得 ...

  8. os模块os.walk() 方法和os.path.join()的简单使用

    os.walk:   http://www.runoob.com/python/os-walk.html os.path.join:   https://blog.csdn.net/zmdzbzbhs ...

  9. Python量化教程 常用函数

    # -*- coding: utf-8 -*- # @Author: fangbei # @Date: 2017-08-26 # @Original: price_str = '30.14, 29.5 ...

  10. Windows:子线程中创建窗口

    一般来讲,UI的所有操作都必须在主线程,否则会出现未知错误.但有时候我们会需要一个功能比较单一的窗口,同时希望他在一个单独的线程运行.并不影响主线程的效率. 下面说明一下新建子线程创建的新窗口的方法, ...