你好,欢迎进入江苏优软数字科技有限公司官网!

诚信、勤奋、创新、卓越

友好定价、专业客服支持、正版软件一站式服务提供

13262879759

工作日:9:00-22:00

codejock 16 JavaScript严格模式解析:什么是严格模式?它与马虎模式有何区别?如何开启严格模式?

发布时间:2025-11-08

浏览次数:0

什么是严格模式

以下是改写后的句子:在某个特定的世界范畴里呢,严格模式属于一种特殊的运行模式,它源自 ES5开始的时候被引入,仿佛便像是给相关代码套上了一副类似“紧箍咒”的东西,使得代码能够运行在更为严格的环境里头。简单去讲呀,严格模式是那该特定范畴的一种带有限制性的变体,其目的在于消除该特定范畴语法里一些显得不合理、不严谨的地方,进而让代码摆脱“马虎模式”(也就是所谓的“某种mode”)啦。

对于非严格模式,可将其视作一个氛围宽松自由的课堂环境,在此环境中,学生们能够随心所欲地随意进出课堂,并且还能毫无顾忌地交头接耳,虽说整体充斥着满满的自由气息,然而却极易陷入混乱无序的状态;与之形成鲜明对比的是,严格模式恰似一个纪律极其严明的课堂情境,在这样的课堂里,学生们务必严格地遵守各种各样的规则,得按时去上课,还得全神贯注地认真听讲,并且要积极主动地举手发言,虽说存在诸多这样那样的限制,但是一切却都能够条理清晰、井然有序,如此便能有效地保证教学的质量以及效率。

要知道严格模式可不是单单局限于语法方面的约束,它实实在在地改变了代码在运行期间的某些行为,针对相关的语法以及语义开展了一系列的调整动作,还进行了优化处理。比如说吧,在并非严格模式的那种情况下,一些有可能引发潜在错误的操作会被悄无声息地给忽略掉,这情形就如同学生在氛围宽松的课堂之上犯了些小错误,老师却没有及时去加以纠正那般;然而在严格模式之下呢,这些操作会直接抛出错误,这就好似在纪律十分严明的课堂里面,一旦出现犯错的情况就会被老师马上指出来,如此一来能够让开发者更加迅速地察觉到问题并解决问题,从而编写出更为健壮、更为安全的代码。

开启严格模式的方式

于其中开启严格模式的办法并非复杂,像是针对程序的不同范畴来“确定规矩”,多数存在全局开启以及函数开启这两种常见路径,。

全局开启

要是你期望整个脚本文件依照严格模式的规则去运行,那就仅需在脚本文件起始处,也就是所有语句的前面,添加上 "use "; (也能够是 'use '; )这般一个特定语句。这恰似在一场竞赛开始之前,裁判宣告所有选手都得遵循一套更严格的竞赛规则那般,一旦添加上了这个语句,整个脚本文件里的代码就都被放置于严格模式的 “管控” 之下 。比如:

// 全局开启严格模式
'use strict';
// 后续所有代码都在严格模式下运行
let num = 10;
console.log(num);

在这个示例当中,‘use ’; 语句呈现于脚本开头所处位置,所以呢,后续诸如声明变量 num 这类操作,均会依照严格模式的各项规则去予以执行。

函数开启

想要仅让特定函数于严格模式里执行,且不想对脚本其余部分造成影响之际,能够于函数体的一切语句之前声明 "use "; ,从而使该函数具备自身独立的 “严格环境” 。这恰似在一场运动会当中,某个特定项目运用了相较于其他项目更为严格的比赛规则 。比如:

function strictFunction() {
  'use strict';
 // 这里的代码在严格模式下运行
 let localVar = 20;
 return localVar;
}
function normalFunction() {
 // 这里的代码在普通模式下运行
 let localVar = 30;
 return localVar;
}

于上述代码里头,那个函数凭借在起始处声明‘use ’;从而步入严格模式,然而codejock 16,另外那个函数并未有着此种声明,所以就处在普通模式下。

需要特别指出的是,于 ES6 所引入的类当中,类的块依据默认的规则采用严格模式。换句话讲,当你着手去定义一个类之际,并不需要额外去声明 "use "; ,类内部的代码已然是按照严格模式的规则在运行了 。举个例子:

class MyClass {
  constructor() {
 // 这里的代码默认在严格模式下运行
 this.value = 42;
 }
 showValue() {
 console.log(this.value);
 }
}

处在这个类里头,不管是构造函数,又或者是成员方法,当中的代码都自行于严格模式下开展执行。

严格模式下的核心限制变量声明限制

在严格模式当中,存在着这样一条挺重要的规则 ,变量得先进行声明之后才能够去使用 。这恰似于在一场赛事里面 ,选手务必先去报名 ,也就是声明变量 ,才可以登上赛场进行比赛 ,也就是使用变量 ,要是没有去报名就登上赛场 ,那绝对是不被准许的 。在非严格模式之下 ,要是直接去使用没声明的变量 ,会以隐式的方式在全局对象之上创建出一个全新的属性 ,比如 :

// 非严格模式
message = "Hello, World!";
console.log(message); ,正常的情况之下那是输出  "Hello, World!" 这个内容的,并且它会隐式地去创建全局变量message喽 。

但是在严格模式下,这种操作会直接抛出 错误:

'use strict';
message = "Hello, World!";
报错,出现了引用错误,即名为message的变量未被定义 。

避免开发者因疏忽写错变量名,意外创建一个全局变量,进而引发所谓全局污染问题,使得代码的变量使用变得更加规范、安全 。这是可以做到的 。

静默失败操作处理

在并非严格的模式里面,有着一些呈现“静默失败”状况的操作,这些操作尽管执行的时候并未成就成功,然而也不会给出任何的错误提示,就如同在漆黑的环境中摸索寻觅却不清楚导向是否准确 。而处于严格模式之下,这些出现静默失败的操作会直接抛出异常,致使开发者能够及时察觉并去解决问题 。犹如给只读属性赋予数值、给不可扩张对象增添属性、删除不可配置属性等这类操作,在并非严格的模式下有可能毫无声息地遭遇失败,不过在严格模式下就会产生报错 。举个例子来讲:

// 非严格模式
var obj = {};
对于对象obj,通过Object.defineProperty方法,定义一个名为'a'的值为1且可写性为假的属性,。
obj.a = 2;
// 不会报错,但是赋值操作实际上并未生效,属于静默失败
console.log(obj.a);
// 输出 1,说明赋值未成功
// 严格模式
'use strict';
var obj = {};
Object.defineProperty(obj, 'a', { value: 1, writable: false });
obj.a = 2;
/ / 抛出异常啦,这个异常是TypeError类型的,啥内容呢,是说不能对对象中某个只读属性‘a’进行赋值,这个对象是‘ #’ ,就出现这样的情况啦。'

函数参数限制

函数参数名必须唯一,这是严格模式的要求,就如同一场会议里,每个人都得有独一无二的名牌(参数名)用以标识自身,在非严格模式时,若函数存在同名参数,后面的参数会将前面的参数覆盖掉,比如:

// 非严格模式
function sum(num1, num1) {
 console.log(num1);
}
sum(1, 2);
// 输出 2,后面的num1覆盖了前面的num1

但在严格模式下,这样的代码会直接抛出 错误:

'use strict';
function sum(num1, num1) {
 console.log(num1);
}
sum(1, 2);

codejock 16_开启JavaScript严格模式方式_JavaScript严格模式

报错,即出现了语法错误,具体为:在这个上下文中,不允许有重复的参数名称,也就是SyntaxError出现了:Duplicate parameter name not allowed in this context 。

这样的限制,能够防止因参数名出现重复的情况,进而致使代码逻辑变得混乱,还可以提升代码的可读性、增强可维护性 ,。

八进制数字语法限制

将以 0 开头表示八进制数字之语法,严格模式予以禁止在用。随着的发展进程,八进制数字语法显出一定歧义性 ,易引发错误状况。例如,有些开发者会把 0 以此开头的数字误作普通十进制数字去处理。在 ES6 之前,许多浏览器支持以 0 开头来表示八进制数,像以 010 表示八进制的 10,转换为十进制即成 8 。然而在严格模式中,此种语法会出现报错情况:

'use strict';
let num = 010;
报错,即出现了语法错误标识为语法错误,具体内容是八进制字面量在严格模式下是不被允许使用的。

在 ES6 当中,引入了一种正确方式,该方式就是以 0o 作为前缀去表示八进制数,举例来说 0o10 代表八进制的 10 ,借由这样的方式就能避免因语法混淆导致问题的出现 。

设置原始值属性限制

于严格模式当中,去设置原始值(像是null等等这些)的属性之时,将会抛出异常,原始值自身属于不可变的基本数据类型,为其设置属性在逻辑层面是不合理的,在非严格模式里,此种操作会被忽略掉,不会产生报错,举例来说:

// 非严格模式
true.name = "test";
// 不会报错,但实际上没有任何效果
console.log(true.name);
// 输出 undefined
// 严格模式
'use strict';
true.name = "test";
发生了这样一种情况,出现了一个错误,这个错误是类型错误,具体表现为不能在布尔值“true”上创建属性“name” 。

严格模式所具备的这种限制条件,能够促使开发者在对数据类型展开操作之际,变得更为严谨,从而防止出现那些表面看似没有错误,然而实际上却毫无实际意义的代码 。

with 关键字禁用

严格模式当中codejock 16,把 with 关键字禁用掉了。with 关键字具备这样的作用,也就是把一个对象的属性临时添加到作用域链里去,从而利于访问对象属性。同时,它有着这样的语法,即为 with () 。举例来说:

// 非严格模式
var obj = { a: 1, b: 2 };
with (obj) {
 console.log(a);
}
// 输出 1,通过with语句可以直接访问obj的属性a

不过,with关键字会致使运行时变量解析出现不确定性,原因在于,当它引用对象属性时,属性名的解析是在运行时才得以确定的,这必定会对引擎针对代码的优化产生影响。举例来说,在with块里,要是访问一个未在with对象中被定义的变量,就会在作用域链中展开查找,这会让代码的执行进程变得繁杂,难以进行预测。因而在严格模式下,运用with关键字会抛出错误,借此强制开发者编写出更具清晰度、更便于优化的代码。

eval 作用域限制

处在严格模式情形下,eval只为运行代码去创建变量,这些变量仅仅于eval内部的作用域才具备有效性,不会对外部作用域产生影响 ,这跟非严格模式下的行为存在差异 。在非严格模式当中,eval执行的代码能够在外部作用域创建变量 ,比如说 :

// 非严格模式
eval("var x = 10;");
console.log(x);
// 输出 10,说明eval在外部作用域创建了变量x
// 严格模式
'use strict';
eval("var x = 10;");
console.log(x);
报错:引用错误,x未定义,x仅仅在eval的内部作用域期间才具备有效性 。

这种限制,避免了eval对外部作用域变量的意想不到的影响,使得代码的作用域,变得更为清晰,更便于控制 。

声明变量删除限制

严禁在严格模式里删除声明变量,变量声明可是代码之中定义变量的关键方式呢,删去声明变量会致使代码的架构以及逻辑被破坏。于非严格模式下,删除声明变量的行为会被忽视,不会出现报错情况,比如:

// 非严格模式
var a = 10;
delete a;
// 不会报错,但是变量a并未被删除
console.log(a);
// 输出 10
// 严格模式
'use strict';
var a = 10;
delete a;
以严格模式中,抛出这样的异常:语法错误,对未限定标识符进行删除操作时出现的错误 ,标点符号为叹号 。

通过这种限制,严格模式保证了变量声明的稳定性,保证了代码的一致性 。

标识符限制

于严格模式当中,eval以及被视作关键字,不可用作标识符,换句话讲就是不能够针对它们开展赋值,声明变量,当作函数名或者函数参数等等操作,不然就会报错 。举例来说:

'use strict';
eval = 10;
报出错误,此错误为语法错误,显示为意外出现的 eval 或者 arguments,处于严格模式之下 。
var arguments = 20;
// 报错:SyntaxError: Unexpected eval or arguments in strict mode
function test(eval) {}
// 报错:SyntaxError: Unexpected eval or arguments in strict mode

这样的限制防止了开发者于无心之状况下对eval以及的错误运用,使得代码当中的怪异行径得以减少 。

严格模式的优势总结减少错误

严格模式最为显著的优势当中的一个,便是它借助抛出错误,把好多在非严格模式时会被静默忽视的问题给暴露出来。如同前面所提到的变量声明限制那样,在非严格模式下,运用未声明的变量是不会报错的,这极有可能致使代码在后续出现难以进行排查的问题;然而严格模式是会直接抛出错误的,可让开发者能够马上发现并修正错误,极大地减少了潜在错误的发生,提升了代码的可靠性。

提高性能

严格模式弥补了部分致使引擎难以施行优化的瑕疵。于非严格模式里,好些语法及行为致使引擎难以对代码予以深度优化,像with关键字所引发的作用域不确定性即为其一。而在严格模式之下,代码的语法与语义更为规范且清晰,引擎能更出色地实施优化,于某些情形当中,可让代码运转得更加迅速,提高了程序的执行效能 。

代码可读性与规范性

严格模式强行运用更为严格的语法规则,这致使代码愈发规范、整齐,仿若给代码披上了一件整洁的外衣 。依照严格模式编写的代码,变量声明明晰、函数参数规范、操作行为明确,极大地提高了代码的可读性,使其他开发者更易于理解代码的逻辑和意图 ,还便利了代码的维护以及后续扩展 。

结语

开发里,严格模式起着相当关键的作用,它宛如一位极为严谨的导师,始终规范着开发者的代码行为,借由一系列严苛的限制,它切实减少了代码中的潜在错误,提升了代码的安全性与稳定性,与此同时,还给引擎优化代码带来了便利,提高了代码的执行性能。对开发者而言,合理运用严格模式,是朝着编写高质量、可维护代码迈进的重要一步。无论你是才初涉开发领域的新手,还是已然积累了丰富经验的编程达人,都需要全面地认知,并且有效地运用严格模式所给予的诸多优势,借助严格模式的“守护协助”,使自己所编写的代码能够更为稳健地去运行 。

如有侵权请联系删除!

13262879759

微信二维码