严格模式

JavaScript 严格模式免费看

什么是严格模式?使用严格模式有什么好处?严格模式的使用、严格模式中的变化

06-22侠课岛    基础入门       

前端/前端必修/JavaScript 基础知识梳理 6     0     199

什么是严格模式?

JavaScript 中有有两种模式,一种是普通模式,另一种就是严格模式。

严格模式是在 ES5 添加的,比普通模式要多一部分的 JavaScript 规则,这使得 JavaScript 在更严格的条件下运行。

JavaScript 一般默认是普通模式,ES6 的模块和 Class 类默认是严格模式。

使用严格模式有什么好处?

  • 使用严格模式可以消除 JavaScript 语言中的一些不合理、不严谨之处,减少怪异现象。
  • 消除代码运行的一些不安全的地方,保证代码能够安全运行。
  • 可以提高编译器效率,提高运行速度。
  • 禁止使用可能在 ECMAScript 的未来版本中定义的潜在保留字。

严格模式的使用

严格模式的触发是使用: "use strict",严格模式有两种使用场合:一种是脚本范围,一种是函数范围。

  • 第一,针对整个脚本调用:

在 HTML 文件中,可以在 <script> 标签内部直接使用 "use strict"。将 "use strict" 放在所有要运行的代码前面,整个脚本都将在严格模式下运行。格式如下所示:

<script>
    "use strict";
</script>
示例:

例如我们之前有讲过在定义变量的时候不如不加关键字 var,则表示创建的是全局变量对吧。但是这是在一般模式下,在严格模式下定义变量不加关键字 var 会导致报错:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS_侠课岛(9xkd.com)</title>
</head>
<body>
<script>
  "use strict";
  a = 6
  console.log(a);
</script>
</body>
</html>

在浏览器中打开,我们会看到浏览器中的控制台显示如下所示:

需要注意的是,"use strict" 前面不能有可执行代码,否则严格模式就会失效,我们来看一下下面这段代码:

<script>
  console.log("use strict前面不能有代码")
  "use strict";
  a = 6
  console.log(a);
</script>

如果此时在浏览器中打开这个 html 文件,控制台显示如下所示,严格模式失效:

  • 第二,针对函数范围使用:

在函数的最顶部使用 "use strict",则整个函数内都是在严格模式下运行:

function func(){
    "use strict";
}
示例:

例如我们来看下面这个函数,在函数 add 中,定义了两个参数,但是两个参数名都相同:

function add(a, a){
    return a+a;
}
var result = add(2, 3);
console.log(result);

此时我们执行这个函数,最终输出结果为 6 ,因为后面的这个参数会覆盖的参数,所以其实 return a+a 返回值的结果为 3 + 3。但是这个在一般模式下运行,如果在严格格式下运行会怎么样呢?

function add(a, a){
    "use strict"; 
    return a+a;
}
var result = add(2, 3);
console.log(result);

执行代码,你会看到控制台显示:

报错信息告诉我们,“此上下文中不允许有重复的参数名”,所以在严格模式下,是不支持用重复的参数名的。

严格模式中的变化

我们来看一下严格模式和一般模式相比,有了什么变化。

  • 严格模式下不允许使用未声明的变量,也就是说不管是全局变量还是局部变量都需要使用关键字 var 定义。
<script>
  "use strict";
  a = 1
  console.log(a);  // test.html:10 Uncaught ReferenceError: a is not defined
</script>
  • JavaScript 语言中允许动态绑定,但是严格模式对动态绑定做出了一点限制,某些情况下,只允许静态绑定。
// 给不可写属性赋值
"use strict";
var obj1 = {};
Object.defineProperty(obj1, "a", {num:7, writable:false});
obj1.a = 10;  // TypeError: Cannot assign to read only property 'a' of object '#<Object>'
  • 严格模式下禁止删除变量,一般模式下则会忽略这个删除语句。
"use strict";
var a = 1;
delete a;  // SyntaxError: Delete of an unqualified identifier in strict mode.
console.log(a);
  • 严格模式下要求函数的参数名必须唯一(不可重复)。
function sum(a, a, b) { 
    "use strict";
    return a + a + c; 
}
// SyntaxError: Duplicate parameter name not allowed in this context
  • 严格模式禁止八进制数字语法(八进制以数字0开头)。
"use strict";
var a = 015;   // SyntaxError: Octal literals are not allowed in strict mode.
console.log(a);
  • 严格模式下,eval 不能用作变量。
"use strict";
var eval = 10;  
console.log(eval);  // SyntaxError: Octal literals are not allowed in strict mode.
  • 为了向将来Javascript的新版本过渡,严格模式新增了一些保留关键字:implementsinterfaceletpackageprivateprotectedpublicstaticyield。使用这些词作为变量名将会报错(一般模式下,这些词是可以作为变量名的)。
"use strict";
var implements = "xkd";  
console.log(implements);  // SyntaxError: Unexpected strict mode reserved word

本教程图文或视频等内容版权归侠课岛所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发布或发表。

评价

6

本课评分:
  •     非常好
难易程度:
  •     适中的

内容目录


本文索引


|
教程
粉丝
主页

签到有礼

已签到2天,连续签到7天即可领取7天全站VIP

  • 1
    +2 金币
  • 2
    +3 金币
  • 3
    +5 金币
  • 6
    +7 金币
  • 5
    +6 金币
  • 4
    暖心福利
    自选分类VIP ×1天
  • 7
    惊喜大礼

    自选分类VIP ×3天 +20金币
  • 持续签到 +8 金币

金币可以用来做什么?