一、 延长作用域链

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

①with语句延长作用域。

function buildUrl(){
var qs="?debug=true";
with(location){
var url=href+qs;
}
return url;
}
buildUrl(); //result:http://www.fanxbao.com/?debug=true

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

function test(){
try{
alert(sum);
}catch(ex){
console.log(ex);
}
} test();//result:ReferenceError: sum is not defined

二、 没有块级作用域

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

private void Test(){
for(int i=0;i<10;i++){
Console.WriteLine(i);
}
Console.WriteLine(i);//报错
}

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

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

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

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

function test(){
 //匿名函数
(

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

){
console.log(i);
}
})();
console.log(i);//报错:i is not defined
}
test();

其实这个过程就类似于:

function test(){
var f=function(){
for(var i=0;i<10;i++){
console.log(i);
}
};
f();
console.log(i);//报错:i is not defined
}
test();

四、var声明变量

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

function add(a,b){
var sum=a+b;
return sum;
}
var result=add(10,20);
console.log(sum);//执行结果:sum is not defined
function add1(a,b){
sum=a+b;
return sum;
}
var result=add1(10,20);
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. HTTPS与强制门户

    强制门户 http://www.whatis.com.cn/word_5182.htm 强制网络门户(captive portal)是一个Web页面,它是使用公共访问网络的用户在被授予访问权限前必须访 ...

  2. [Android Tips] 7. 以调试模式启动应用

    adb shell am set-debug-app -w {package_name}

  3. -Xmx 和 –Xms 设置最大堆和最小堆

    C:\Java\jre1.6.0\bin\javaw.exe 按照上面所说的,最后参数在eclipse.ini中可以写成这个样子: -vmargs     -Xms128M     -Xmx512M ...

  4. .NET中通過OUTLOOK發送附件內容

    最近碰到一個發送郵件附件的問題,隨便幾下來,方便以後學習. string[] files = System.IO.Directory.GetFiles(@"~/UploadData" ...

  5. sqlyong64位破解

    姓名(Name):cr173 序列号(Code):8d8120df-a5c3-4989-8f47-5afc79c56e7c 或者(OR) 姓名(Name):cr173 序列号(Code):59adfd ...

  6. mongodb备份与恢复

    一.备份:mongodump -d mailaccess -c Mail -q ‘{user:”zhaoxy1@szdep.com”}’ -o /data/dump备份mailaccess datab ...

  7. UIButton设置圆角和边框及边框颜色

    1. 按钮边框颜色 //设置边框颜色 [btn.layer setMasksToBounds:YES]; [btn.layer setCornerRadius:10.0]; //设置矩形四个圆角半径 ...

  8. Linux之保留yum安装软件后的RPM包

    yum安装软件很方便,但是下载下来的rpm包在安装后默认会被删除掉: 如果希望保留yum安装的软件包该如何做呢? 设置方法: 将/etc/yum.conf里对应的keepcache参数改为1即可,然后 ...

  9. objective C 学习之02

    1. 函数 -(void) HelloWorld:(BOOL)ishelloworld{ //干点啥 } 前面带有减号(-) 的方法为实例方法,必须使用类的实例才可以调用的.对应的有+号, 代表是类的 ...

  10. 简单了解.net

    .NET是 Microsoft XML Web services 平台.XML Web services 允许应用程序通过 Internet 进行通讯和共享数据,而不管所采用的是哪种操作系统.设备或编 ...