JavaScript 有个 with 关键字, with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象.
用过 Java 和 .NET 的同学对包或命名空间的概念应该不会陌生, 正因为有这个概念, 使代码的简洁易读得到了保证. 不知 JavaScript 设计之初是如何定位 with 语句的, 个人觉得它们之间有一定的相似度. 如:
1
2
|
apple.banana.candy.dog.egg.fog.god.huh.index = 0;
doSomething(apple.banana.candy.dog.egg.fog.god.huh.index);
|
利用 with 语句, 可以写为以下代码.
1
2
3
4
|
with(apple.banana.candy.dog.egg.fog.god.huh) {
c = 0;
doSomething(index);
}
|
看起来很美妙, 却存在致命的缺陷. 下面我们来进行一些小测试吧.
1. 在 with 语句内部通过内部变量修改数值
1
2
3
4
5
6
7
8
9
10
11
12
13
|
var root = {
branch: {
node: 1
}
};
with(root.branch) {
node = 0;
// 显示 0, 正确!
alert(node);
}
// 显示 0, 正确!
alert(root.branch.node);
|
2. 在 with 语句内部通过对象节点修改数值
1
2
3
4
5
6
7
8
9
10
11
12
13
|
var root = {
branch: {
node: 1
}
};
with(root.branch) {
root.branch.node = 0;
// 显示 0, 正确!
alert(node);
}
// 显示 0, 正确!
alert(root.branch.node);
|
经过测试 1 和测试 2, 乍看没什么问题, 但是... 请看测试 3.
3. 在 with 语句内部通过对象父节点修改数值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
var root = {
branch: {
node: 1
}
};
with(root.branch) {
root.branch = {
node: 0
};
// 显示 1, 错误!
alert(node);
}
// 显示 0, 正确!
alert(root.branch.node);
|
由上面的测试 3 可知, with 语句内部的节点父节点修改后, 不会同步到节点本身. 也就是说, 不能保证内外数值的一致性. 这是可能成为项目里面隐藏性很高的 bug.
那我们该怎么办呢? 接受那很长的一串逐级访问, 还是另有他法?
方法是有的. 我们可以通过别名引用父节点的方式来调用节点对象, 如:
1
2
3
4
5
6
7
8
9
10
|
var root = {
branch: {
node: 1
}
};
var quote = root.branch;
quote.node = 0;
// 显示 0, 正确!
alert(root.branch.node);
|
分享到:
相关推荐
### JavaScript中的关键字 JavaScript是一种广泛使用的编程语言,用于为网页添加交互性。它拥有大量预定义的关键字,这些关键字在语言中有特殊的含义,并且不能用作变量名或函数名等标识符。理解这些关键字对于编写...
JavaScript 和 VBScript,虽然都是常用的脚本语言,但它们的关键字和保留字有所不同。 JavaScript 关键字: 1. `break`:用于跳出循环(如`for`,`while`)或者`switch`语句。 2. `case`:`switch`语句的一部分,...
2009年12月,ECMAScript发布了ECMAScript 5,这距离上一个版本的ECMAScript 3标准发布已经整整十年了,其间JavaScript虽然大行于web编程,ECMAScript 4却最终因为利益相关的各大厂商和组织在此语言的复杂性(即是否...
在JavaScript编程语言中,"with"关键字是一个较少被提及且在现代开发中通常不推荐使用的工具。在早先的编程实践中,"with"关键字被用来简化对同一对象属性的多次引用。然而,随着JavaScript的演进和对最佳实践认识的...
### JavaScript关键字、保留字及其属性详解 #### 一、JavaScript 关键字与保留字 JavaScript是一种广泛使用的脚本语言,用于网页开发以及其他多种用途。它包含了一系列的关键字和保留字,这些词在语言中具有特殊的...
### JavaScript基础关键字详解 #### 一、概述 在JavaScript编程语言中,关键字(也称作保留字)扮演着至关重要的角色。这些关键字拥有特殊的含义,主要用于定义语言的基本结构或者执行特定的操作。根据JavaScript...
JavaScript 关键字保留字属性及说明 JavaScript 中的关键字是指 JavaScript 语言中具有特殊含义的单词,这些单词不能用作变量、函数或其他标识符的名称。JavaScript 的关键字可以分为两类:一种是保留字,另外一种...
JavaScript 保留关键字是编程语言中预定义的词汇,它们具有特殊含义,不能被用作变量名、函数名或任何标识符。这是因为这些关键字已经被JavaScript引擎内部使用,用于控制程序的结构和行为。以下是一些主要的...
JavaScript保留关键字包括抽象(abstract)、arguments、boolean、break、byte、case、catch、char、class、const、continue、debugger、default、delete、do、double、else、enum、eval、export、extends、false、...
在JavaScript编程语言中,关键字和保留字是具有特殊含义的词汇,它们被JavaScript引擎用于解析和执行代码。了解并熟悉这些关键字和保留字对于编写有效的、无错误的JavaScript代码至关重要。以下是对这些概念的详细...
break do instanceof typeof case else new var catch finally return void continue for switch while debugger* function this with default if throw delete in try ECM
此外,Douglas Crockford对语言中的一些"坏部分"(如with关键字和全局变量)进行了批判,提倡使用更安全、更简洁的编程习惯。 无论是初学者还是经验丰富的开发者,这本书都能提供深刻的洞见和实用的技巧,帮助你更...
JavaScript 有个 with 关键字, with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象. with语句的作用是暂时改变作用域链、减少的重复输入。 其语法...
with open('sougou_index.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4) ``` 在这个过程中,可能需要处理登录、反爬虫策略等复杂情况。对于登录,可以利用`requests`的...
### JavaScript保留字与关键字详解 #### 一、前言 在JavaScript编程语言中,有一些预定义的词被称为关键字(Keywords)或保留字(Reserved Words)。这些词汇被语言本身赋予了特殊的意义,不能作为变量名或其他...
### JavaScript经典之作——从入门到高级大全 #### 一、简介 《JavaScript经典之作》是一部由作者cxl编写的详尽教程,旨在帮助读者全面掌握JavaScript编程语言的基础知识与高级技巧。本书覆盖了从初学者到进阶学习...