Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JavaScript 严格模式

JavaScript 严格模式

作者头像
李振
发布于 2021-11-26 07:01:04
发布于 2021-11-26 07:01:04
83000
代码可运行
举报
文章被收录于专栏:乱码李乱码李
运行总次数:0
代码可运行

简介

ECMAScript 5 引入了严格模式(strict mode)的概念。严格模式为JavaScript定义了一种不同的解析与执行模型。在严格模式下,ECMAScript 3中的一些不确定的行为将得到处理,而且对于某些不安全的操作也会抛出错误。(JavaScript高级程序设计

设立严格模式的目的:

  1. 严格模式会将JavaScript陷阱直接变成明显的错误。
  2. 严格模式修正了一些引擎难以优化的错误。
  3. 同样的代码有些时候严格模式会比非严格模式下更快。
  4. 严格模式禁用了一些有可能在未来版本中定义的语法。

开启严格模式

使用 ‘use strict’; 进入严格模式。 严格模式可以应用到整个script标签或个别函数中。

为整个script标签开启严格模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 整个语句都开启严格模式的语法
"use strict";
console.log('严格模式script')

注意: 如果要为整个script开启严格模式,‘use strict’; 一定要放在第一行。 如果担心文件合并带来严格模式与正常模式的混合,可以将script写成自执行函数的形式。

为某个函数开启严格模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function strict() {
    "use strict";  
    return "严格模式函数";
}
function notStrict() {
    return "正常模式函数";
}

严格模式有哪些不同

全局变量显式声明

在正常模式下,如果一个变量未声明就直接赋值,相当于创建一个全局变量。这给新人开发者带来便利的同时,给整个项目留下巨大隐患。严格模式将这种失误当成错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'use strict';
a = '严格模式';  //ReferenceError: a is not defined

不再Silently Fail

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

不可变量赋值

例如: NaN 是一个不可写的全局变量. 在正常模式下, 给 NaN 赋值不会产生任何作用; 开发者也不会受到任何错误反馈. 但在严格模式下, 给 NaN 赋值会抛出一个异常。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'use strict';
NaN = 3; //TypeError: Cannot assign to read only property 'NaN' of #<Object>

给不可写属性赋值, 给只读属性(getter-only)赋值赋值, 给不可扩展对象(non-extensible object)的新属性赋值) 都会抛出异常:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"use strict";

// 给不可写属性赋值
var obj1 = {};
Object.defineProperty(obj1, "x", {
    value: 42,
    writable: false
});
obj1.x = 9; // TypeError: Cannot assign to read only property 'x' of #<Object>

// 给只读属性赋值
var obj2 = {
    get x() {
        return 17;
    }
};
obj2.x = 5; // TypeError: Cannot set property x of #<Object> which has only a getter

// 给不可扩展对象的新属性赋值
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "haha"; // TypeError: Can't add property newProp, object is not extensible

删除不可删除属性

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"use strict";
delete Object.prototype; //TypeError: Cannot delete property 'prototype' of function Object()

参数名唯一

严格模式要求函数的参数名唯一。在正常模式下, 最后一个重名参数名会掩盖之前的重名参数。 之前的参数仍然可以通过 arguments[i] 来访问。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function sum(a, a, c) { //SyntaxError: Strict mode function may not have duplicate parameter names
    "use strict";
    return a + b + c;
}

禁止八进制数字语法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"use strict";
var sum = 015 + // SyntaxError: Octal literals are not allowed in strict mode.
          197 +
          142;

简化变量的使用

禁用 with

先看一个with的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var x = 17;
var obj = {
    //x: 4
};
with(obj) {
    x = 2;
}

console.log(x);

结果是2, with块内x为全局变量x。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var x = 17;
var obj = {
    x: 4
};
with(obj) {
    x = 2;
}

console.log(x);

结果是17, with块内x为变量obj.x。

所以with中块内的x究竟是指全局变量x还是obj.x在运行之前是无法得知的,这对编译器优化十分不利,因此严格模式禁用 with。

eval作用域

严格模式下的 eval 不在为上层范围(surrounding scope,注:包围eval代码块的范围)引入新变量。

在正常模式下, 代码 eval(“var x;”) 会给上层函数(surrounding function)或者全局引入一个新的变量 x 。 严格模式下,eval语句本身就是一个作用域,它所生成的变量只能用于eval内部。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var x = 17;
var evalX = eval("'use strict'; var x = 32; x");
console.log(x); //17

var y = 17;
var evalY = eval("var y = 32; y");
console.log(y); //32

禁止删除声明变量

严格模式禁止删除声明变量。delete name 在严格模式下会引起语法错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"use strict";

var x;
delete x; // SyntaxError: Delete of an unqualified identifier in strict mode.

eval("var x; delete x;"); // SyntaxError

让eval和arguments变的简单

绑定或赋值

eval 和 arguments 不能通过程序语法被绑定或赋值。 以下的所有尝试将引起语法错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"use strict";
eval = 17;
arguments++;
++eval;
var obj = {
    set p(arguments) {}
};
var eval;
try {} catch (arguments) {}

function x(eval) {}

function arguments() {}
var y = function eval() {};
var f = new Function("arguments", "'use strict'; return 17;");

arguments对象

arguments对象不再追踪参数的变化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function f(a) {
    "use strict";
    a = 42;
    return [a, arguments[0]];
}
var pair = f(17);
console.assert(pair[0] === 42);
console.assert(pair[1] === 17);

不再支持 arguments.callee

正常模式下,arguments.callee 指向当前正在执行的函数。这个作用很小:直接给执行函数命名就可以了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"use strict";
var f = function() { return arguments.callee; };
f(); // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

“安全的” JavaScript

严格模式下更容易写出“安全”的JavaScript。

this关键字

在严格模式下通过this传递给一个函数的值不会被强制转换为一个对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function f() {    
    console.log(this);  
} 
function f1() {    
    "use strict";    
    console.log(this);
}

f.bind(3)();  //[Number: 3]
f1.bind(3)();  //3

对一个普通的函数来说,this总会是一个对象:不管调用时this它本来就是一个对象;还是用布尔值,字符串或者数字调用函数时函数里面被封装成对象的this;还是使用undefined或者null调用函数时this代表的全局对象(使用call, apply或者bind方法来指定一个确定的this)。

这种自动转化为对象的过程不仅是一种性能上的损耗,同时在浏览器中暴露出全局对象也会成为安全隐患。

所以对于一个开启严格模式的函数,指定的this不再被封装为对象,而且如果没有指定this的话它值是undefined。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"use strict";
function fun() { return this; }
assert(fun() === undefined);
assert(fun.call(2) === 2);
assert(fun.apply(null) === null);
assert(fun.call(undefined) === undefined);
assert(fun.bind(true)() === true);

为未来的ECMAScript版本铺平道路

保留的关键字

在严格模式中一部分字符变成了保留的关键字。这些字符包括implements, interface, let, package, private, protected, public, static和yield。在严格模式下,你不能再用这些名字作为变量名或者形参名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function package(protected) // !!!
{
    "use strict";
    var implements; // !!!

    interface: // !!!
        while (true) {
            break interface; // !!!
        }

    function private() {} // !!!
}

function fun(static) {
    'use strict';
} // !!!

函数声明

严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"use strict";
if (true)
{
  function f() { } // !!! 语法错误
  f();
}
for (var i = 0; i < 5; i++)
{
  function f2() { } // !!! 语法错误
  f2();
}
function baz() // 合法
{
  function eit() { } // 同样合法
}

总结

严格模式虽然限制了一部分JavaScript书写和运行的自由,但是随着JavaScript在更大的工程中扮演更重要的角色,规范化是必经之路。

参考链接

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript 严格模式
严格模式是 ECMAScript5 (ES5)发布的语言新特性。使用严格模式可以限制 JavaScript 的一些语言特性,使用严格模式可以去除在书写代码时的一些“骚操作”(有些特性在严格模式下是不可用的),使代码更严谨整洁。
多云转晴
2020/02/17
9790
Js严格模式
JavaScript严格模式strict mode,即在严格的条件下运行。严格模式消除了Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;消除代码运行的一些不安全之处,保证代码运行的安全;提高了引擎的效率,增加运行速度;为未来新的Js版本做好铺垫。
WindRunnerMax
2020/08/27
2.3K0
23严格模式
严格模式是Javascript中的一种限制性更强的変种方式。严格模式不是一个子集:它在语义上与正常代码有着明显的差异。
Dreamy.TZK
2020/06/07
7970
严格模式use strict
JavaScript是一个弱类型语言,这其实跟JavaScript创建之初有关系。当时JavaScript的作者只是随便写一个语言来临时使用,鬼知道JavaScript会在今天这么有地位。
wade
2020/04/24
9600
js的严格模式(strict mode)
消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为; 消除代码运行的一些不安全之处,保证代码运行的安全; 提高编译器效率,增加运行速度; 为未来新版本的Javascript做好铺垫。 "严格模式"体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。
acc8226
2022/05/17
8230
JavaScript词法作用域(你不知道的JavaScript)
1. JavaScript引擎在代码执行前会对其进行编译,在这个过程中,像var a = 2 这样的声明会被分解成两个独立的步骤: 第一步(编译阶段):var a 在其作用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。 第二步(运行阶段):a = 2 会查询变量a(LHS查询)并对其进行赋值。 2. LHS & RHS(当前作用域->上级作用域->...->全局作用域) LHS(左侧):试图找到变量的容器本身 RHS(右侧):查找某个变量的值 示例:
奋飛
2019/08/15
5400
函数(function)的前世今生
函数就是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。
江米小枣
2020/06/16
7070
函数(function)的前世今生
从零开始学 Web 之 ES6(一)ES5严格模式
除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。
Daotin
2018/08/31
4950
JS与ES6高级编程学习笔记(一)——JavaScript核心组成
JavaScript(JS)是一种轻量级、解释型、动态类型的高级程序设计语言。它诞生于1995年,是一门基于原型、函数优先的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持,如 Node.js、 Apache CouchDB 和 Adobe Acrobat。它已经由ECMA(欧洲计算机制造商协会)通过ECMAScript实现语言的标准化。
张果
2022/05/27
2.1K0
JS与ES6高级编程学习笔记(一)——JavaScript核心组成
3《JavaScript高级程序设计》__ 语言基础(上)
大家好,我是HoMeTown,web领域有一本神书大家应该都有看过,这本书我看过两遍,但是每次看都是粗粗的略过一些重要的知识点,甚至一些面试过程中的问题,在这本书里都能找到答案。
HoMeTown
2022/10/26
6600
3《JavaScript高级程序设计》__ 语言基础(上)
严格模式 – JavaScript
ECMAScript 5的严格模式是JavaScript中的一种限制性更强的变种方式。严格模式不是一个子集:它在语义上与正常代码有着明显的差异。不支持严格模式的浏览器与支持严格模式的浏览器行为上也不一样, 所以不要在未经严格模式特性测试情况下使用严格模式。严格模式可以与非严格模式共存,所以脚本可以逐渐的选择性加入严格模式。
前Thoughtworks-杨焱
2021/12/08
1K0
重学JS-1.1-知识点:严格模式“use strict”
为了使用新特性,避开老版本中这些不完善的特性,我们可以开启严格模式“use strict”。
luciozhang
2023/04/22
9660
重学JS-1.1-知识点:严格模式“use strict”
Javascript 严格模式详解
一、概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。 设立"严格模式"的目
ruanyf
2018/04/12
1.2K0
Javascript 严格模式详解
JavaScript严格模式
"use strict" 指令 "use strict" 指令在 JavaScript 1.8.5 (ECMAScript5) 中新增。它不是一条语句,但是是一个字面量表达式,在 JavaScript
xiangzhihong
2018/02/05
1.4K0
JavaScript严格模式
【JavaScript】JavaScript 几个标准阐述
ES5于2009年发布;ES6于2015年发布,也称ES2015;ES7于2016年发布。
前端修罗场
2023/10/07
2470
【JavaScript】JavaScript 几个标准阐述
javascript中的Strict模式
我们都知道javascript是一个弱类型语言,在ES5之前,javascript的程序编写具有很强的随意性,我可以称之为懒散模式(sloppy mode)。比如可以使用未定义的变量,可以给对象中的任意属性赋值并不会抛出异常等等。
程序那些事
2021/03/15
9150
JavaScript 严格模式介绍
如我们所知,JavaScript 是一门灵活的语言。其灵活性同样也带来了很多坑,当然也有一些是设计缺陷。比如
前端GoGoGo
2018/08/24
6930
【JS】312- 复习 JavaScript 严格模式(Strict Mode)
注:本文为 《 JavaScript 完全手册(2018版) 》第30节,你可以查看该手册的完整目录。
pingan8787
2019/08/09
1K0
【JS ES6】use strict 严格模式
由于 JavaScript 语法不够严谨,一直被人们所诟病,例如在使用一个变量时,可以不使用 var 关键字来提前声明(例如:url = 'http://c.biancheng.net/';),此时 JavaScript 解释器会自动为您创建这个变量。为了使代码更加严谨,JavaScript 中引入了严格模式,一旦使用了严格模式,将不再允许使用那些不严谨的语法。
坚毅的小解同志的前端社区
2022/11/28
1.8K0
【JS ES6】use strict 严格模式
再有人问你JavaScript中的严格模式是什么?把这篇文章丢给他
在ECMAScript5标准中,JavaScript提出了严格模式的概念(Strict Mode):
zayyo
2023/12/06
2421
推荐阅读
相关推荐
JavaScript 严格模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验