一、 延长作用域链

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

①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. Thinkphp---------Call to a member function free_result() on a non-object

    1.平时用框架用久了,直接执行原生的sql反而做起来反应迟钝了.今天遇到一个问题,就是直接执行一个添加的sql语句,然后我用了TP框架的M()->query();方法.运行以后,会报Call t ...

  2. JS倒计时——天时分秒

      HTML代码: <div id="times_wrap" class="time_num">    距离结束时间:     <div cl ...

  3. Android——初探Dagger2依赖注入

    1,在做项目时,经常需要在一个对象里去创建另一个对象的示例,这种行为是产生耦合的常见形式,对于一个大型项目来说,过多的相互依赖会导致代码难以维护,很容易就会碰到修改一个小需求需要大面积的修改各种代码, ...

  4. css布局之左侧固定右侧自适应布局

    参考代码如下: <form id="form1" style="height:100%; overflow:hidden;"> <div st ...

  5. MVC(二)

    所谓EF延迟加载,就是使用Lamabda或Linq查询数据时,EF并不会将数据直接查询出来,而是在用到的这个查询结果的时候才会加载到内存中.延迟加载也可以理解成 按需加载,顾名思义,就是按照所需的数据 ...

  6. 03-组合逻辑电路设计之译码器——小梅哥FPGA设计思想与验证方法视频教程配套文档

    芯航线——普利斯队长精心奉献 课程目标:    1. 再次熟悉Quartus II工程的建立以及完整的FPGA开发流程 2. 以译码器为例学会简单组合逻辑电路设计 实验平台:无 实验原理: 组合逻辑, ...

  7. lua table 排序--满足多条件排序

    前提 假设 一个小怪 有三种属性,等级(level).品质(quality).id(pid) 我们需要对他们进行排序,两种排序情况,第一是单一属性排序,比如按照等级进行排序,或者多种属性进行优先级排序 ...

  8. imx6Q rtl8188etv Android4.3 驱动调试记录

    vim kernel_imx/arch/arm/configs/imx6s_{yourdevice}_android_defconfig CONFIG_CFG80211=y CONFIG_MAC802 ...

  9. json根据key取values

    function getJson(key, jsonObj) { for (var item in jsonObj) { if (item == key) { //item 表示Json串中的属性,如 ...

  10. ContentProvider总结

    一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给 ...