一、 延长作用域链

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

①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. innerHTML

    对于innerHTML 属性,几乎所有的元素都有innerHTML属性,它是一个字符串,用来设置或获取位于对象起始和结束标签内的HTML.(获取HTML当前标签的起始和结束里面的内容) 下面的例子返回 ...

  2. linux服务器性能优化

    1.这里的吞吐率特指Web服务器单位时间内处理的请求.       2.压力测试的前提:1>并发用户数 2>总请求数 3>请求资源描述       3.用户平均请求等待时间主要用户衡 ...

  3. .Net程序员安卓学习之路4:使用xutils Get Post数据

    前面使用了一些网络上找来的类进行网络访问,后来发现了安卓开发中有一个国人写的类库xutils比较全面,也比较经典,故后续使用xutils类库进行记录. 本例服务端使用WCF来实现,写好的WCF服务端在 ...

  4. jenkins+gerrit

    Verified 功能 http://www.cnblogs.com/zhanchenjin/p/5032218.html

  5. Microsoft JScript提示‘DIRECT’未定义(2014-08-26记)

    当启动Applet的时候,页面弹出:DIRECT’未定义可能的问题是:java控制面板的网络设置问题,可能使用了代理解决: 打开java控制面板--->网络设置-->直接连接-->确 ...

  6. python : HTML+CSS (定时器轮寻)

    定时器轮寻 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  7. Android ToolBar

    众所周知,在使用ActionBar的时候,一堆的问题:这个文字能不能定制,位置能不能改变,图标的间距怎么控制神马的,由此暴露出了ActionBar设计的不灵活.为此官方提供了ToolBar,并且提供了 ...

  8. Linux sticky bit 目录权限 rwt权限

    [linux权限分为 user group others三组] 今天看到有个目录的权限是rwxrwxrwt 很惊讶这个t是什么,怎么不是x或者-呢?搜了下发现: 这个t代表是所谓的sticky bit ...

  9. Linux -- 文件统计常用命令

    标签(空格分隔): Linux sort -- 文件内排序命令 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次比较其ASCII码. 按每行升序排序: sort seq.tx ...

  10. Response.End()在Webform和ASP.NET MVC下的表现差异

    前几天在博问中看到一个问题--Response.End()后,是否停止执行?MVC与WebForm不一致.看到LZ的描述后,虽然奇怪于为何用Response.End()而不用return方式去控制流程 ...