作用域(1)---Js作用域链及变量作用域
2015-10-20 17:44
489 查看
【转载】
要理解变量的作用域范围就得先理解作用域链
用var关键字声明一个变量时,就是为该变量所在的对象添加了一个属性。
作用域链:由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是window对象的属性,所以这些对象的关系可以看作是一条链
链头就是变量所处的对象,链尾就是window对象
看下面的代码:
js中函数也是对象,所以变量a所在的对象是t,t又在window对象中,所以a的作用域链如下
t--window
那么b所以在的对象即t2,t2又包含在t中,t又在window对象,所以b的作用域链如下
t2--t--window
明白了作用域链下面就开始变量的作用域分析了
1 javascript 没有var的变量都为全局变量,且为window对象的属性
2 函数内(函数内的函数除外)定义的变量在整个函数内部都有效
3 函数内部的变量取代全局同名变量
4 没块的作用域
要理解变量的作用域范围就得先理解作用域链
用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);
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- IE8开发人员工具教程(二)
- 在flex中执行一个javascript方法的简单方式
- Flex结合JavaScript读取本地路径的方法
- PowerShell中执行Javascript的方法示例
- javascript asp教程第六课-- response方法
- javascript asp教程More About Recordsets