[原创文章,转载请请声明:来自http://lllt.iteye.com]
《Javascript高级程序设计(第二版)》第66页中提到:“由于with语句的变量对象是只读的,结果url就成了函数执行环境的一部分,因而可以作为函数的值被返回。”,不知道谁看完觉得一头雾水?
首先来看看他举的例子:
function buildUrl(){
var qs="?debug=true";
with(location){
var url=href+qs;
}
return url;
}
var result=buildUrl();
alert(result);
如果你没读过着本书,并且需要学习javascript,请思考并尝试运行该例子。
最后弹出的不是undefined,而是你的静态页地址+qs的值。
来看一下with语句的作用:
通俗的说,就是引用对象,并对该对象上的属性进行操作,其作用是可以省略重复书写该对象名称,起到简化书写的作用。
但是有几个问题需要注意:
1、with代码块中,javascript引擎对变量的处理方式是:先查找是不是该对象的属性,如果是,则停止。如果不是继续查找是不是局部变量。(在《Javascript高级程序设计(第二版)》中提到的观点,跟这一点恰好相反,但是实例可证明其是错误的,会在接下来介绍)
2、就算在with语句中使用 var 运算符重新定义变量(该变量是with引用对象的属性),如果该属性是可写属性,那么也会给对象的属性赋值。
3、如果你想通过with语句,对引用对象添加多个属性,并为每个属性赋值,这是不可能的!也就是说,要赋值的只能是对象已经存在并且可以写入的属性(不能是只读属性)。
再来看看开头提到的那句话
“由于with语句的变量对象是只读的,结果url就成了函数执行环境的一部分,因而可以作为函数的值被返回。”
反过来:如果with语句的变量对象是可写入的…… 刚才第3点提过,不能给对象写入原来不存在的属性,先这样理解,下面还有另外的含义。
那延长作用域链又是怎么回事?
一般的,“由于with语句块中作用域的‘变量对象’是只读的,所以在他本层定义的标识符,不能存储到本层,而是存储到它的上一层作用域”。这里又要理解有一层“只读”的含义。
在Javascript的作用域中(作用域,想想就是函数块,每个函数都会有个函数名,就算是匿名函数也有个空函数名),那么创建作用域的时候,本层的标识符就可以寄托在这个作用域下,而with语句块中作用域的‘变量对象’是只读的,不能存储标识符,只能存储在其上一层,这就是延长作用域链。其实,这和上面说的不能给对象添加属性有同工之处。
其实,完全可以这样理解,在Javascript中,没有块级作用域,就是说除了函数,其他的块级代码都没有自己的作用域。
现在说一下之前提到的with代码块中变量处理方式的问题
用事实说话:
var o={href:"sssss"};
var href="1111";
function buildUrl(){
var qs="?debug=true";
with(o){
href="2222";
var url=href+qs;
}
return url;
}
var result=buildUrl();
alert(result);
alert(href);
结果:2222?debug=true + 1111
很明显,with语句中并没有更改变量href的值,而是更改了 o 对象的 href 属性。
就是说,with中首先查找的是相关对象的属性,如果没有,才改变变量的值。你可以将以上例子o对象的href属性去掉看看。
[原创文章,转载请请声明:来自http://lllt.iteye.com]
分享到:
相关推荐
下面我们从多个方面来详细探讨作用域链的概念、作用域链的层级关系、变量访问的性能影响,以及如何通过优化作用域链来提升程序性能。 首先,作用域是编程中一个基本的概念,它决定了变量和函数的可访问范围。在...
### JavaScript:函数与作用域 #### 一、函数基础 **1.1 函数声明与表达式** ...以上就是关于JavaScript中的函数与作用域的基本概念和用法。理解这些基本概念对于编写高效可靠的JavaScript程序至关重要。
JavaScript 变量作用域是基于其特有的作用域链的。在 JavaScript 中,变量作用域是指变量可以被访问和修改的范围。 JavaScript 没有块级作用域,而是基于函数作用域和全局作用域的。 首先,看看 JavaScript 的作用...
- **作用域**:讨论了函数作用域和全局作用域,以及闭包的原理和应用。 4. **对象与原型**: - **对象创建与操作**:涵盖对象字面量、构造函数、原型链以及属性访问器的使用。 - **原型与继承**:讲解JavaScript...
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。任何程序...
- **作用域**: JavaScript有全局作用域、函数作用域和块级作用域。 通过以上知识点的梳理,我们可以看到《JavaScript权威指南》第6版涵盖了从基础语法到高级特性的全面内容,对于希望深入了解JavaScript及其在Web...
### JavaScript作用域链(Scope Chain)初探 #### 一、引言 JavaScript的作用域链是一个重要的概念,尤其是在深入理解JavaScript执行机制时不可或缺的一部分。本文将通过对几个具体例子的分析来探讨JavaScript作用域...
总的来说,JavaScript 作用域链是理解和解决变量访问、作用域冲突以及内存管理等问题的关键。正确理解和运用作用域链可以避免许多常见的编程陷阱,并帮助你编写更高效、更易于维护的代码。在实际开发中,掌握作用域...
JavaScript中的作用域是编程中一个基础且至关重要的概念,它决定了变量在何处可被访问以及其可见性。简单来说,作用域就是变量的生存空间,它定义了变量的生命周期和可访问区域。理解作用域有助于编写更加高效、简洁...
本篇将详细解释JavaScript作用域的几个核心特性,包括无块级作用域、函数作用域、作用域链以及作用域链的创建时间。 1. 无块级作用域 不同于Java或C#,JavaScript并没有块级作用域,这意味着在JavaScript中,大括号...
深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...
虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! 作用域(Scope) 1. 什么是作用域 作用域是在运行时代码中的某些特定部分中...
JavaScript作用域是编程中至关重要的概念,它定义了变量、函数和对象的可见性和生命周期。在JavaScript中,作用域主要分为两种类型:全局作用域和局部作用域。此外,随着ES6的引入,块级作用域和函数作用域也变得...
JavaScript中的变量作用域和作用域链是编程中非常重要的概念,尤其对于JavaScript这种函数作用域的语言来说更是如此。本文将详细解析这两个知识点,并通过实例帮助理解。 **一、变量作用域** JavaScript中的变量...
JavaScript的作用域链是理解JavaScript变量查找和闭包的关键概念。以下是对这八个点的详细解释: 1. **定义时作用域链与运行时作用域链**: - 定义时作用域链([[Scope]])是在函数创建时确定的,它记录了函数声明...
JavaScript的作用域和作用域链是理解JavaScript中变量和函数如何访问和管理的关键概念。作用域决定了变量和函数的可见性和生命周期,它分为静态作用域和动态作用域。 **静态作用域(词法作用域)** JavaScript遵循...