要理解变量的作用域范围就得先理解作用域链 
用var关键字声明一个变量时,就是为该变量所在的对象添加了一个属性。 
作用域链:由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是window对象的属性,所以这些对象的关系可以看作是一条链 
链头就是变量所处的对象,链尾就是window对象

看下面的代码:

function t() {
var a;
function t2() {
var b;
}
}

js中函数也是对象,所以变量a所在的对象是t,t又在window对象中,所以a的作用域链如下 
t--window 
那么b所以在的对象即t2,t2又包含在t中,t又在window对象,所以b的作用域链如下 
t2--t--window 
明白了作用域链下面就开始变量的作用域分析了 
       
1 javascript 没有var的变量都为全局变量,且为window对象的属性

function test1() {
//执行这个句的时候它会找作用域对象,这个函数就是作用域链中的第一个对象,但这个对象中没有相关的var语句
//于里就找作用域链的第二个对象,即全局对象,而全局对象中也没有相关的var语句
//由于没有相关的var语句,js隐式在函数地声明了变量即var all;
all = 30;
alert(all);
} test1(); alert(all);
alert(window.all);

2 函数内(函数内的函数除外)定义的变量在整个函数内部都有效

function test2() {
var t = 0;
//在for的条件里定义变量,这个变更的作用域链对象是这个函数
//因此在整个的函数里它是有效的
for (var i = 0; i < 5; i++) {
t += i;
}
alert(i);
}
test2();

3 函数内部的变量取代全局同名变量

var t = "bb";
function test() {
//执行t的时候,它会先找作用域链对象,由于它定义在函数内部,所以这个函数就是它的作用域链的第一个对象
//而在这个对象里又有t的定义,所以t就是局部变量了,它替换了全局变量t //t只是此时有定义,但并没有赋值,赋值在下一行,所以这里输出了undefined
alert(t);
var t = "aa";
alert(t);
}
test();

4 没块的作用域

if (true) {
//在块中定义了一个变量,它的作用域链的第一个对象就是全局对象window
var tmp = 0;
}
//tmp的作用域链的第一个对象就是全局对象window,而上面又有全局对象中相关的var语句,因此输出0
alert(tmp);

Js作用域链及变量作用域的更多相关文章

  1. javascript中函数的执行环境、作用域链、变量对象与活动对象

    javascript高级程序设计中:对执行环境.作用域链.变量对象.活动对象的解释: 1.执行环境: 执行环境:有时也叫环境:是JavaScript中最为重要的一个概念:执行环境定义了变量或函数有权访 ...

  2. JS中for循环变量作用域--解决for循环异步执行的问题

    被这个问题困惑了很久,终于在网上找到了答案,感谢~ 现在分享给大家~ js中如何让一个for循环走完之后,再去执行下面的语句? 这涉及for循环变量作用域的问题,js中作用域只有函数作用域和全局作用域 ...

  3. js:函数与变量作用域的提升

    一.要彻底理解JS的作用域和Hoisting,只要记住以下三点即可:      1.所有申明都会被提升到作用域的最顶上      2.同一个变量申明只进行一次,并且因此其他申明都会被忽略      3 ...

  4. JS中for循环变量作用域

    http://www.cnblogs.com/zhus/p/6513741.html  博主写得很好

  5. js学习--变量作用域和作用域链

    作为一名菜鸟的我,每天学点的感觉还是不错的.今天学习闭包的过程中看到作用域与作用域链这两个概念,我觉得作为一名有追求的小白,有必要详细了解下. 变量的作用域 就js变量而言,有全局变量和局部变量.这里 ...

  6. JS高级. 05 词法作用域、变量名提升、作用域链、闭包

    作用域 域,表示的是一个范围,作用域,就是作用范围. 作用域说明的是一个变量可以在什么地方被使用,什么地方不能被使用. 块级作用域 JavaScript中没有块级作用域 { var num = 123 ...

  7. 深入学习JS执行--创建执行上下文(变量对象,作用域链,this)

    一.介绍 本篇继上一篇深入理解js执行--单线程的JS,这次我们来深入了解js执行过程中的执行上下文. 本篇涉及到的名词:预执行,执行上下文,变量对象,活动对象,作用域链,this等 二.预执行 在上 ...

  8. (O)JS:执行环境、变量对象、活动对象和作用域链(原创)

    var a=1; function b(x){ var c=2; console.log(x); } b(3); ·执行环境(execution context),也称为环境.执行上下文.上下文环境. ...

  9. JS中的函数声明和函数表达式的区别,即function(){}和var function(){},以及变量提升、作用域和作用域链

    一.前言 Uncaught TypeError: ... is not a function function max(){}表示函数声明,可以放在代码的任何位置,也可以在任何地方成功调用: var ...

随机推荐

  1. log4j中文乱码解决方案

    项目中log4j在英文版linux下输出中文日志为乱码. 由于log4j配置文件中没有设置编码格式(encoding),所以log4j就使用系统默认编码.导致乱码. 解决方法是设置编码格式UTF-8, ...

  2. 编写Music类

    package a; public class Instrument { public void play() { System.out.println("弹奏乐器"); } } ...

  3. UVA 1252 十五 Twenty Questions

    十五 Twenty Questions Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submi ...

  4. Cheatsheet: 2013 11.01 ~ 11.11

    Other Back To Basics: Hashtables – Part2 How To Make A Game Part 1:Picking a Framework Modern Garbag ...

  5. tesseract-ocr了解

    安装文件下载地址 http://tesseract-ocr.googlecode.com/files/tesseract-ocr-setup-3.01-1.exe README For the lat ...

  6. HDU 1698 Just a Hook(线段树成段更新)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  7. GATK3.2.2小结(转载)

    http://blog.csdn.net/skenoy/article/details/38346489 经过几天的摸索和网上资料的查询对GATK软件有点小心得,现总结如下: 1. fasta文件最好 ...

  8. java位运算符常见用法

    1. 判断int型变量a是奇数还是偶数 a&1 = 0 偶数 a&1 = 1 奇数 2. 求平均值,比如有两个int类型变量x.y,首先要求x+y的和,再除以2,但是有可能x+y的结果 ...

  9. oracle学习之bulk collect用法

    通过bulk collect减少loop处理的开销,使用Bulk Collect提高Oracle查询效率 Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使 ...

  10. 【转】Github 上传代码

    版权声明:欢迎转载(^ω^)~不过转载请注明原文出处:http://blog.csdn.net/catglory ლ(╹◡╹ლ) 写在前面: 弄了两小时终于搞定了,把经验整理下,方便我以后上传代码XD ...