`
lllt
  • 浏览: 66680 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript:with的用法以及延长作用域链

 
阅读更多

     [原创文章,转载请请声明:来自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]

3
1
分享到:
评论

相关推荐

    深入了解JavaScript,优化作用域链(2).pdf

    下面我们从多个方面来详细探讨作用域链的概念、作用域链的层级关系、变量访问的性能影响,以及如何通过优化作用域链来提升程序性能。 首先,作用域是编程中一个基本的概念,它决定了变量和函数的可访问范围。在...

    JavaScript:函数与作用域

    ### JavaScript:函数与作用域 #### 一、函数基础 **1.1 函数声明与表达式** ...以上就是关于JavaScript中的函数与作用域的基本概念和用法。理解这些基本概念对于编写高效可靠的JavaScript程序至关重要。

    javascript变量作用域

    JavaScript 变量作用域是基于其特有的作用域链的。在 JavaScript 中,变量作用域是指变量可以被访问和修改的范围。 JavaScript 没有块级作用域,而是基于函数作用域和全局作用域的。 首先,看看 JavaScript 的作用...

    JavaScript: The Definitive Guide, 5th Edition

    - **作用域**:讨论了函数作用域和全局作用域,以及闭包的原理和应用。 4. **对象与原型**: - **对象创建与操作**:涵盖对象字面量、构造函数、原型链以及属性访问器的使用。 - **原型与继承**:讲解JavaScript...

    理解JavaScript作用域和作用域链

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。任何程序...

    [JavaScript权威指南(第6版)].(JavaScript:The.Definitive.Guide).David.Flanagan.文字版.pdf

    - **作用域**: JavaScript有全局作用域、函数作用域和块级作用域。 通过以上知识点的梳理,我们可以看到《JavaScript权威指南》第6版涵盖了从基础语法到高级特性的全面内容,对于希望深入了解JavaScript及其在Web...

    javascript作用域链(Scope Chain)初探.docx

    ### JavaScript作用域链(Scope Chain)初探 #### 一、引言 JavaScript的作用域链是一个重要的概念,尤其是在深入理解JavaScript执行机制时不可或缺的一部分。本文将通过对几个具体例子的分析来探讨JavaScript作用域...

    javascript作用域链(Scope Chain)用法实例解析

    总的来说,JavaScript 作用域链是理解和解决变量访问、作用域冲突以及内存管理等问题的关键。正确理解和运用作用域链可以避免许多常见的编程陷阱,并帮助你编写更高效、更易于维护的代码。在实际开发中,掌握作用域...

    Javascript作用域和作用域链原理解析

    JavaScript中的作用域是编程中一个基础且至关重要的概念,它决定了变量在何处可被访问以及其可见性。简单来说,作用域就是变量的生存空间,它定义了变量的生命周期和可访问区域。理解作用域有助于编写更加高效、简洁...

    JavaScript作用域示例详解_.docx

    本篇将详细解释JavaScript作用域的几个核心特性,包括无块级作用域、函数作用域、作用域链以及作用域链的创建时间。 1. 无块级作用域 不同于Java或C#,JavaScript并没有块级作用域,这意味着在JavaScript中,大括号...

    深化理解javascript作用域其次篇之词法作用域和动态作用域_.docx

    深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...

    详解JavaScript作用域和作用域链

    虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! 作用域(Scope) 1. 什么是作用域 作用域是在运行时代码中的某些特定部分中...

    JavaScript作用域原理

    JavaScript作用域是编程中至关重要的概念,它定义了变量、函数和对象的可见性和生命周期。在JavaScript中,作用域主要分为两种类型:全局作用域和局部作用域。此外,随着ES6的引入,块级作用域和函数作用域也变得...

    Javascript变量的作用域和作用域链详解

    JavaScript中的变量作用域和作用域链是编程中非常重要的概念,尤其对于JavaScript这种函数作用域的语言来说更是如此。本文将详细解析这两个知识点,并通过实例帮助理解。 **一、变量作用域** JavaScript中的变量...

    关于Javascript作用域链的八点总结

    JavaScript的作用域链是理解JavaScript变量查找和闭包的关键概念。以下是对这八个点的详细解释: 1. **定义时作用域链与运行时作用域链**: - 定义时作用域链([[Scope]])是在函数创建时确定的,它记录了函数声明...

    聊一聊JavaScript作用域和作用域链

    JavaScript的作用域和作用域链是理解JavaScript中变量和函数如何访问和管理的关键概念。作用域决定了变量和函数的可见性和生命周期,它分为静态作用域和动态作用域。 **静态作用域(词法作用域)** JavaScript遵循...

Global site tag (gtag.js) - Google Analytics