首页 > 其他分享 >【JS ES6】use strict 严格模式

【JS ES6】use strict 严格模式

时间:2022-10-29 16:34:22浏览次数:83  
标签:ES6 use strict JavaScript 模式 严格 报错



【JS ES6】use strict 严格模式_严格模式

目录

​​什么是严格模式​​

​​启用严格模式​​

​​严格模式中的变化​​


由于 JavaScript 语法不够严谨,一直被人们所诟病,例如在使用一个变量时,可以不使用 var 关键字来提前声明(例如:​​url = 'http://c.biancheng.net/';​​),此时 JavaScript 解释器会自动为您创建这个变量。为了使代码更加严谨,JavaScript 中引入了严格模式,一旦使用了严格模式,将不再允许使用那些不严谨的语法。

什么是严格模式

严格模式是在 ECMAScript5(ES5)中引入的,在严格模式下,JavaScript 对语法的要求会更加严格,一些在正常模式下能够运行的代码,在严格模式下将不能运行。

添加严格模式,主要有以下几个目的:

  • 消除 JavaScript 语法中一些不合理、不严谨的地方;
  • 消除代码中一些不安全的地方,保证代码的安全运行;
  • 提高 JavaScript 程序的运行效率;
  • 为以后新版本的 JavaScript 做好铺垫。

目前,主流浏览器包括 IE10 及其之后的版本都已支持严格模式,JavaScript 正在向着更合理、更安全、更严谨的方向发展。

启用严格模式

要启用严格模式,您只需要在 JavaScript 脚本的开头添加​​"use strict";​​​或​​'use strict';​​指令即可,如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript</title>
</head>
<body>
<script>
"use strict";
x = 'http://c.binacheng.net/'; // 此处报错:Uncaught ReferenceError: x is not defined at index.html:11
console.log(x);
</script>
</body>
</html>

如果将​​"use strict";​​​指令添加到 JavaScript 程序的第一行,则表示整个脚本都会处于严格模式。如果在函数的第一行代码中添加​​"use strict";​​,则表示只在该函数中启用严格模式。如下例所示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript</title>
</head>
<body>
<script>
x = 'http://c.binacheng.net/';
console.log(x);
function sayHello(){
'use strict';
str = 'welcome http://c.binacheng.net/'; // 调用 sayHello() 函数在此处报错:Uncaught ReferenceError: str is not defined at sayHello (index.html:14) at index.html:17
console.log(str);
}
sayHello();
</script>
</body>
</html>

注意:​​"use strict";​​​或​​'use strict';​​指令只有在整个脚本第一行或者函数第一行时才能被识别,除了 IE9 以及更低的版本外,所有的浏览器都支持该指令。

严格模式中的变化

相对于普通模式来说,严格模式对 JavaScript 的语法都做了一些改变。

1、不允许使用未声明的变量

普通模式下,如果一个变量还没有声明,就直接拿来赋值,JavaScript 解释器会自动为您创建这个变量。而在严格模式下,则不允许这么做,所有变量在使用前必须显式的声明,否则将会抛出一个 ReferenceError 错误。

"use strict";
v = 1; // 此处报错:Uncaught ReferenceError: v is not defined
for(i = 0; i < 2; i++) { // 此处报错:Uncaught ReferenceError: i is not defined
}

2、不允许删除变量或函数

在严格模式下,如果您尝试删除一个变量或函数,则会抛出语法错误。而在普通模式下,虽然不会成功,但并不报错。

"use strict";
var person = {name: "Peter", age: 28};
delete person; // 此处报错:Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
function sum(a, b) {
return a + b;
}
delete sum; // 此处报错:Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.

3、函数中不允许有同名的参数

在严格模式下,如果函数中有两个或多个同名参数,则会抛出语法错误,而在普通模式下则不会。

"use strict";
function square(a, a) { // 此处报错:Uncaught SyntaxError: Duplicate parameter name not allowed in this context
return a * a;
}

4、eval 语句的作用域是独立的

普通模式下,eval 语句的作用域取决于它所在的位置,而在严格模式下,eval 语句本身就是一个局部作用域,通过 eval 语句生成的变量只能在 eval 语句内使用。

"use strict";
eval("var x = 5; console.log(x);");
console.log(x); // 此处报错:Uncaught ReferenceError: x is not defined

5、不允许使用 with 语句

在严格模式下,不允许使用 with 语句。

"use strict";
var radius1 = 5;
var area1 = Math.PI * radius1 * radius1;
var radius2 = 5;
with(Math) { // 此处报错:Uncaught SyntaxError: Strict mode code may not include a with statement
var area2 = PI * radius2 * radius2;
}

6、不允许写入只读属性

在严格模式下,不允许为只读或不存在的属性赋值,否则会造成语法错误,而在普通模式下,虽然不会成功,但并不会报错。

"use strict";
var person = {name: "Peter", age: 28};
Object.defineProperty(person, "gender", {value: "male", writable: false});
person.gender = "female"; // 此处报错:Uncaught TypeError: Cannot assign to read only property 'gender' of object '#<Object>'

7、不允许使用八进制数

在严格模式下,不允许使用八进制数(以零为前缀的数字,例如 010、0377),而在普通模式下则可以。

"use strict";
var x = 010; // 此处报错:Uncaught SyntaxError: Octal literals are not allowed in strict mode.
console.log(parseInt(x));

8、不能在 if 语句中声明函数

在严格模式下,不能在 if 语句中声明函数,调用在 if 语句中定义的函数时,会提示函数未定义。

"use strict";
//如果在if语句中声明函数,则会产生语法错误
if (true) {
function demo() { // 此处报错:Uncaught ReferenceError: demo is not defined
console.log("http://c.biancheng.net/");
}
}
demo();

9、禁止使用 this 表示全局对象

在普通模式下,this 关键字表示全局对象 window,而在严格模式下,this关键字则表示 undefined。

"use strict";
var name = "http://c.biancheng.net/";
function demoTest() {
console.log(this);
}
demoTest();

标签:ES6,use,strict,JavaScript,模式,严格,报错
From: https://blog.51cto.com/u_15830125/5806248

相关文章

  • [JS ES6]传值和传址
     目录​​传值​​​​什么是传值​​​​ 例 ​​​​传址​​​​什么是传址​​​​例 ​​传值什么是传值leta=1;letb=a;console.log(a,b);//11 传值是......
  • 【Windows】问题:Port 8080 is already in use
    问题解决1、查看端口占用情况netstat-ano|findstr"8080"2、确定占用端口的进程号(PID)获得占用8080端口的PID为7192SC:\Users\Administrator>netstat-ano|findstr"8080......
  • 单机部署ClickHouse
    一、单机部署ClickHouse1.1、ClickHouse部署前提Clickhouse官网为:[https://clickhouse.com/],在官网中可以看到ClickHouse可以基于多种方式安装,rpm安装、tgz安装包安装......
  • 【原创】i.MXRT J-Flash烧写算法使能eFuse熔丝位写入
    ​    临近年底,终于又憋了一篇文章出来,本来年初的时候是有计划把去年总结的一些东西整理下发布出来的,结果还是被工作和生活上各种琐事给耽搁了。哎,今年刚过了自己35......
  • Error updating database. Cause: java.sql.SQLException: Field 'id' doesn't have
    我想着id(主键)不填写的话可以在增加数据的时候可以自动添加上,且递增的,但是在添加数据的时候却报错了Errorupdatingdatabase. Cause:java.sql.SQLException:Field'i......
  • JavaScript--ES5和ES6(上)
    一、概述es表示ECMASCript,他是从es3,es5,es6,es5是2009.12月发布的,es6是2015.6月发布的。vue2完全支持es5的(vue3完全支持es6的),react完全支持es6二、es5的新特性1、严格模......
  • JavavScript--ES5和ES6(下)
    一、Map基于set和array之上构建的一个集合1、Map的声明使用new关键字和Map构造函数letm=newMap();通过二维数组声明vararr=[[1,2],[3,4]]varmap=ne......
  • ubuntu学习5 more/less/head/tail/which/用户和组/useradd/useradel/usermod/groupadd
    more: 查看文件内容  more11.txtless :查看文件内容    less11.txthead:输出文件的开始的部分,可以指定行数,默认显示10行   head11.txth......
  • 导出报错cannot be resolved to absolute file path because it does not reside in t
    SpringBoot项目打包部署,读取jar里面的文件报错500,异常日志关键提示cannotberesolvedtoabsolutefilepathbecauseitdoesnotresideinthefilesystem报错定位......
  • ES6 WeakSet
    WeakSet类似WeakMap,weak表示弱映射,value(弱弱地拿着)而且必须是对象,意思是key不是正式引用,不会阻止垃圾回收,但只要key存在就不会被垃圾回收机制销毁。 操作......