一、 延长作用域链

有些语句可以在作用域前端临时增加一个变量对象,该变量对象在代码执行完成后会被移除。

①with语句延长作用域。

  1. function buildUrl(){
  2. var qs="?debug=true";
  3. with(location){
  4. var url=href+qs;
  5. }
  6. return url;
  7. }
  8. buildUrl(); //result:http://www.fanxbao.com/?debug=true

②try...catch...中的catch语句块延长作用域链。

  1. function test(){
  2. try{
  3. alert(sum);
  4. }catch(ex){
  5. console.log(ex);
  6. }
  7. }
  8.  
  9. test();//result:ReferenceError: sum is not defined

二、 没有块级作用域

一般在C类语言中,由花括号封闭的代码块有自己的作用域,其中定义的变量在代码块外部是不可见的。例如在c#中:

  1. private void Test(){
  2. for(int i=0;i<10;i++){
  3. Console.WriteLine(i);
  4. }
  5. Console.WriteLine(i);//报错
  6. }

但是,在javascript中却不同,在代码块中创建的变量会将其添加到当前执行环境中。在代码块执行完毕后不会自动销毁。例如:

  1. function test(){
  2. for(var i=0;i<10;i++){
  3. console.log(i);
  4. }
  5. console.log(i);//可以执行,结果输出10
  6. }
  7. test();

这里的变量i被添加到全局作用域中,在for循环之后仍可以访问。

三、 匿名函数模仿块级作用域

  1. function test(){
  1. //匿名函数
  2. (

function(){ for(var i=0;i<10;i++

  1. ){
  2. console.log(i);
  3. }
  4. })();
  5. console.log(i);//报错:i is not defined
  6. }
  7. test();

其实这个过程就类似于:

  1. function test(){
  2. var f=function(){
  3. for(var i=0;i<10;i++){
  4. console.log(i);
  5. }
  6. };
  7. f();
  8. console.log(i);//报错:i is not defined
  9. }
  10. test();

四、var声明变量

使用var声明的变量会自动被添加到最接近的执行环境中,比如在函数内部声明的变量执行环境就是函数这个局部环境。但是如果变量声明时没有使用var,则作用域为全局执行环境。例如:

  1. function add(a,b){
  2. var sum=a+b;
  3. return sum;
  4. }
  5. var result=add(10,20);
  6. console.log(sum);//执行结果:sum is not defined
  1. function add1(a,b){
  2. sum=a+b;
  3. return sum;
  4. }
  5. var result=add1(10,20);
  6. console.log(sum);//执行结果:30

不过这种情况要尽量避免,很容易出现不易发现的错误。

读javascript高级程序设计02-变量作用域的更多相关文章

  1. 读javascript高级程序设计00-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

  2. 读javascript高级程序设计-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

  3. 读javascript高级程序设计08-引用类型之Global、Math、String

    一.Global 所有在全局作用域定义的属性和方法,都属于Global对象. 1.URI编码: encodeURI():主要用于对整个URI编码.它不会对本身属于URI的特殊字符进行编码. encod ...

  4. 《JavaScript高级程序设计》 -- 变量、作用域和内存问题(二)

    1.基本类型与引用类型 基本类型:值保存在变量中 (Number.String.Boolean.Undefined.Null).在内存中占据固定大小空间,被保存在栈内存中 引用类型:值是保存在内存中的 ...

  5. 读javascript高级程序设计03-函数表达式、闭包、私有变量

    一.函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式.它们之间一个重要的区别是函数提升. 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); functi ...

  6. JavaScript高级程序设计-(3) 变量、作用域和内存问题

    传递参数 ECMAScript所有函数参数都是按值传递的,即使对象在函数内部修改了参数的值,原始的引用任然不变,局部对象在函数执行完毕后被销毁

  7. 读javascript高级程序设计10-DOM

    一.节点关系 元素的childNodes属性来表示其所有子节点,它是一个NodeList对象,会随着DOM结构的变化动态变化. hasChildNodes():是否有子节点. var headline ...

  8. 读javascript高级程序设计01-基本概念、数据类型、函数

    一. javascript构成 1.javascript实现由三部分组成: ECMAScript:核心语言功能 DOM:文档对象模型,提供访问和操作网页内容的方法和接口 BOM:浏览器对象模型,提供与 ...

  9. 读javascript高级程序设计09-BOM

    一.window 1.在全局作用域中定义的变量和函数会被归在window对象. var a=1,b=2; function add(a,b){ return a+b; } console.log(wi ...

随机推荐

  1. ubuntu 常用命令集合版(一)【大侠勿喷,菜鸟欢迎】(转载)

    1:apt-get:(一般是要加sudo) debian系系统的软件包管理程序(其图形化前端就是大名鼎鼎的新立得了),会自动帮你搞定依赖关系最常用参数:update        —-与你的软件源(在 ...

  2. JAVA并行框架:Fork/Join

    一.背景 虽然目前处理器核心数已经发展到很大数目,但是按任务并发处理并不能完全充分的利用处理器资源,因为一般的应用程序没有那么多的并发处理任务.基于这种现状,考虑把一个任务拆分成多个单元,每个单元分别 ...

  3. ligerui_ligerTree_005_动态增加“树”节点

    动态添加ligerTree节点:效果图: 源码地址:http://download.csdn.net/detail/poiuy1991719/8571255 <%@ page language= ...

  4. configure.ac:32: error: possibly undefined macro: AC_DEFINE

    在ubuntu 下编译snappy时,在检查依赖关系时,处理autoconf的包时,在相关依赖包都已经安装的情况下,报如下错误,死活不过. configure.ac:32: error: possib ...

  5. windows平台(不包括ARM的CE)通用的压缩和解压缩

    通用是相对的,这里指的是xp和win7(其他版本我没测试过,不要用不要来找我) #define CMP_FRM COMPRESSION_FORMAT_LZNT1|COMPRESSION_ENGINE_ ...

  6. Oracle创建/删除表空间和用户(2014-3-10 记)

    /*创建表空间名为:DB_NAME*/ create tablespace DB_NAME datafile 'E:\oracle_data\db_name.dbf' size 100M autoex ...

  7. Your pain

    Your pain is the breaking of the shell that encloses your understanding. 你的痛苦是你那包裹知识的皮壳的破裂.

  8. Ubuntu16.04搭建LAMP架构服务器

     安装Apache: weirubo@weirubo-VirtualBox:~$ sudo apt-get install apache2 查看Apache版本: weirubo@weirubo-Vi ...

  9. UIDatePicker 日期/时间选取器(滚轮)—IOS开发

    UIDatePicker 是一个控制器类,封装了 UIPickerView,但是他是UIControl的子类,专门用于接受日期.时间和持续时长的输入.日期选取器的各列会按照指定的风格进行自动配置,这样 ...

  10. 获取本地IP,并设置到IP控件

    char szHostName[MAX_PATH + 1]; gethostname(szHostName, MAX_PATH); //得到计算机名 hostent *p = gethostbynam ...