什么是“use strict”,好处和坏处

本文深入探讨JavaScript中的严格模式,介绍了如何启用该模式及它带来的多种好处,包括提高代码质量和安全性、提升编译效率等,并列举了一系列在严格模式下会触发错误的编程实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

use ‘strict’: "严格模式"是一种在JavaScript代码运行时自动实行更严格解析和错误处理的方法。这种模式使得Javascript在更严格的条件下运行。

最好只在函数内使用严格模式例如:

function doSomething() { 
“use strict”; 
// 严格模式下运行 
}

function doSomethingElse() { 
// 非严格模式下运行 

如果你想严格模式应用于多个函数:

(function() {

"use strict";  

function doSomething() {  
    // this runs in strict mode  
}  

function doSomethingElse() {  
    // so does this  
}  

}()); 

设立"严格模式"的优点:

1. 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;

2. 消除代码运行的一些不安全之处,保证代码运行的安全;

3. 提高编译器效率,增加运行速度;

4. 为未来新版本的Javascript做好铺垫。

注:经过测试 IE6,7,8,9 均不支持严格模式。

缺点:

现在网站的 JS 都会进行压缩,一些文件用了严格模式,而另一些没有。这时这些本来是严格模式的文件,被 merge 后,这个串就到了文件的中间,不仅没有指示严格模式,反而在压缩后浪费了字节。

事例:

变量必须先声明,再使用
function test(){
  "use strict";
  foo = 'bar';  // Error
}
 
不能对变量执行delete操作
var foo = "test";
function test(){}
 
delete foo; // Error
delete test; // Error
 
function test2(arg) {
    delete arg; // Error
}
对象的属性名不能重复
{ foo: true, foo: false } // Error
 
禁用eval()
 
函数的arguments参数
setTimeout(function later(){
  // do stuff...
  setTimeout( later, 1000 );
}, 1000 );
 
禁用with(){}
 
不能修改arguments
不能在函数内定义arguments变量
不能使用arugment.caller和argument.callee。因此如果你要引用匿名函数,需要对匿名函数命名。

1.使调试更加容易。那些被忽略或默默失败了的代码错误,会产生错误或抛出异常,因此尽早提醒你代码中的问题,你才能更快地指引到它们的源代码。

2.变量在赋值之前必须声明,防止意外的全局变量。如果没有严格模式,将值分配给一个未声明的变量会自动创建该名称的全局变量。这是JavaScript中最常见的错误之一。在严格模式下,这样做的话会抛出错误。

3.取消this值的强制转换。如果没有严格模式,引用null或未定义的值到 this 值会自动强制到全局变量。在严格模式下,引用 null或未定义的 this 值会抛出错误。严格模式下,this不会指向window 

4.不允许重复的属性名称参数值。当检测到对象中重复命名的属性,例如:

    var object = {foo: "bar", foo: "baz"};

    或检测到函数中重复命名的参数时,例如:

    function foo(val1, val2, val1){})

    严格模式会抛出错误,因此捕捉几乎可以肯定是代码中的bug可以避免浪费大量的跟踪时间。

5.使 eval() 更安全。在严格模式和非严格模式下, eval() 的行为方式有所不同。最显而易见的是,在严格模式下,变量和声明在 eval() 语句内部的函数不会在包含范围内创建(它们会在非严格模式下的包含范围中被创建,这也是一个常见的问题源)。

eval()没有被移除,但它在严格模式下发生了一些变化。最大的改变是:在eval()语句中声明的变量以及函数不会在包含域中创建。例如:

(function() {

eval("var x = 10;");  

// 非严格模式下,x为10  
// 严格模式下,x没有声明,抛出一个错误  
alert(x);  

})(); 
任意由eval()创建的变量或函数仍呆在eval()里。然而,你可以通过从eval()中返回一个值的方式实现值的传递:

(function() {

var result = eval("var x = 10, y = 20; x + y");  

// 严格模式与非严格模式下都能正常工作(得到30)  
alert(result);  

}()); 

6.在 delete 使用无效时抛出错误。 delete 操作符(用于从对象中删除属性)不能用在对象不可配置的属性上。当试图删除一个不可配置的属性时,非严格代码将默默地失败,而严格模式将在这样的情况下抛出异常。

7.严格模式去除了with语句

8.不能修改arguments ,不能在函数内定义arguments变量  ,不能使用arugment.caller和argument.callee。因此如果你要引用匿名函数,需要对匿名函数命名。  



<think>好的,我需要回答用户关于JavaScript中'use strict'的含义作用的问题。首先,我得回忆一下严格模式的基本概念。严格模式是ES5引入的,用来让代码在更严格的条件下运行,帮助开发者避免一些常见的错误,同时禁用了一些不推荐的语法。 用户可能想知道为什么需要使用它,以及它具体有什么作用。我应该从含义、作用、使用方式注意事项几个方面来组织回答。根据用户提供的引用,特别是引用[1][2],虽然它们没有直接提到严格模式,但引用[2]提到原型对象的重要性,这可能与严格模式中的一些限制相关,比如禁止使用未声明的变量,或者限制this的指向。 首先,严格模式的定义,需要在脚本或函数开头添加'use strict'。然后,它的主要作用包括:捕获常见错误,如未声明的变量;禁止不安全的操作,比如删除变量或函数参数;简化evalarguments的使用;以及改变this的默认指向,全局作用域中this不再是window而是undefined,防止意外创建全局变量。 接下来,需要举一些例子来说明这些变化。例如,在非严格模式下,未声明的变量会隐式成为全局变量,而严格模式会抛出错误。再比如,试图删除变量或函数参数会导致语法错误。另外,在构造函数中,如果忘记使用new,this不会指向全局对象,而是保持undefined,从而避免意外覆盖全局变量。 关于使用方式,应该提到在脚本文件开头或函数体顶部添加'use strict'。但要注意,合并多个脚本时,如果有些脚本没有使用严格模式,可能会导致问题。此外,现代模块系统如ES6模块默认启用严格模式,所以在这种情况下可能不需要显式声明。 注意事项方面,严格模式一旦启用无法取消,所以在代码中混用严格非严格模式需要小心。另外,一些旧版浏览器可能不支持严格模式,但现代浏览器基本都支持了,这个问题现在可能不那么突出,但还是要提一下。 然后,根据用户提供的引用,虽然引用[3]提到OAuth2.0JWT,这可能与当前问题无关,但需要确保回答不偏离主题。引用[1]提到使用内置函数如filter来提高效率,可能可以关联到严格模式帮助写出更规范的代码,从而提升代码质量。 最后,生成相关问题,需要涵盖严格模式的其他方面,比如兼容性、常见错误、与ES6模块的关系,以及实际应用场景。例如,严格模式如何影响变量声明、在ES6中的必要性、实际项目中的应用案例等。 现在需要检查是否有遗漏点,比如严格模式对八进制字面量的限制,重复的函数参数名的禁止,以及eval的独立作用域等。这些也是严格模式的重要部分,应该提到。 总结起来,回答的结构应该是:含义、主要作用、使用方式、注意事项,然后相关问题。确保每个部分都有清晰的例子解释,帮助用户逐步理解。</think>### 'use strict' 的含义作用 **1. 含义** `'use strict'` 是 JavaScript 的一种严格模式(Strict Mode),通过添加此指令,代码会在更严格的语法规则下执行,帮助开发者避免常见错误,并禁用一些不推荐或危险的语法特性[^1]。 --- **2. 主要作用** - **捕获错误** 未声明的变量赋值会直接报错(非严格模式下会隐式创建全局变量): ```javascript 'use strict'; x = 10; // 报错:x is not defined ``` - **禁止不安全操作** 删除变量、函数参数等操作会报错: ```javascript 'use strict'; let a = 1; delete a; // 报错:Delete of an unqualified identifier in strict mode ``` - **简化 `eval` `arguments`** `eval` 不再在外部作用域引入变量,`arguments` 不再与形参动态绑定: ```javascript 'use strict'; function test(x) { arguments[0] = 2; console.log(x); // 输出原值(非严格模式下输出2) } test(1); ``` - **修改 `this` 默认行为** 全局作用域中 `this` 为 `undefined`(非严格模式下指向 `window`),防止意外创建全局变量: ```javascript 'use strict'; function test() { console.log(this); // 输出 undefined } test(); ``` --- **3. 使用方式** - **脚本级启用**:在文件或 `<script>` 标签的首行添加 `'use strict'`。 - **函数级启用**:在函数体首行添加(仅对该函数生效): ```javascript function strictFunc() { 'use strict'; // 严格模式代码 } ``` --- **4. 注意事项** - 严格模式无法通过语法取消,需避免与非严格模式代码混用。 - 现代模块(ES6 Module)类(Class)默认启用严格模式,无需显式声明[^2]。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值