JavaScript with语句

JavaScript的with语句常导致错误和兼容性问题,尤其是在ECMAScript 5的严格模式下被禁止。它通过扩展作用域链来访问对象的属性,但推荐使用临时变量作为替代以提高代码清晰性和兼容性。

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

不建议使用with语句,因为它可能是混淆错误和兼容性问题的根源。在 ECMAScript 5 严格模式中该标签已被禁止。推荐的替代方案是声明一个临时变量来承载你所需要的属性。

with

扩展一个语句的作用域链。

语法

with (expression) {
    statement
}

expression
将给定的表达式添加到在评估语句时使用的作用域链上。表达式周围的括号是必需的。
statement
任何语句。要执行多个语句,请使用一个块语句 ({ … })对这些语句进行分组。

描述

JavaScript查找某个未使用命名空间的变量时,会通过作用域链来查找,作用域链是跟执行代码的context或者包含这个变量的函数有关。with语句將某个对象添加到作用域链的顶部,如果在statement中有某个未使用命名空间的变量,跟作用域链中的某个属性同名,则这个变量将指向这个属性值。如果沒有同名的属性,则将拋出ReferenceError异常。

Example:

下面的with语句指定Math对象作为默认对象。with语句里面的变量,分別指向Math对象的PI 、cos和sin函数,不用在前面添加命名空间。

let a, x, y
let r = 10
with (Math) {
  a = PI * r * r  
  x = r * cos(PI)
  y = r * sin(PI / 2)
}

模块作用域中的with:
文件 a.js

module.exports = {
  x: 1
}

文件 b.js

const obj = require('./a')
with (obj) {
  console.log(x)
  console.log(y)
}
// 1
// ReferenceError: y is not defined

参考链接:
MDN JavaScript with

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值