js作用域链和变量的作用域
来源:互联网 发布:mysql经典入门书籍 编辑:程序博客网 时间:2024/04/27 15:26
作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
全局作用域
在代码中任何地方都能访问到的对象拥有全局作用域。
1)最外层函数和在最外层函数外面定义的变量拥有全局作用域。
2)所有末定义直接赋值的变量自动声明为拥有全局作用域。
3)所有window对象的属性拥有全局作用域。
一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。
局部作用域
局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所以在一些地方也会看到有人把这种作用域称为函数作用域。
函数是对象,有一个内部属性[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
要理解变量的作用域范围就得先理解作用域链
用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
明白了作用域链下面就开始变量的作用域分析了 。
没有var的变量都为全局变量,且为window对象的属性
function test1() { //执行这个语句的时候它会找作用域链,这个函数就是作用域链中的第一个对象,但这个对象中没有相关的var语句 //于里就找作用域链的第二个对象,即全局对象,而全局对象中也没有相关的var语句 //由于没有相关的var语句,js在全局对象中隐式地声明了变量即var all; all = 30; alert(all); } test1();//30alert(all); //30alert(window.all);//30
函数内定义的变量在整个函数内部都有效
function test2() { var t = 0; //在for的条件里定义变量,这个变量的第一个作用域链对象是这个函数 //因此在整个的函数里它是有效的 for (var i = 0; i < 5; i++) { t += i; } alert(i); } test2();//5
函数内部的变量取代全局同名变量
var t = "bb"; function test() { //执行t的时候,它会找作用域链,由于变量提升,它定义在函数内部,所以这个函数就是它的作用域链的第一个对象 //而在这个对象里又有t的定义,所以t就是局部变量了,它替换了全局变量t //t此时只是有定义,但并没有赋值,赋值在下一行,所以这里输出了undefined alert(t); var t = "aa"; alert(t); } test();alert(t); //undefined//aa//bb
没有块的作用域
if(true){ //在块中定义了一个变量,它的作用域链的第一个对象就是全局对象window var tmp = 0; } //tmp的作用域链的第一个对象就是全局对象window,而上面又有全局对象中相关的var语句,因此输出0 alert(tmp);
1 0
- js作用域链和变量的作用域
- js变量和作用域
- js变量的作用域
- 变量的作用域js
- js的变量作用域
- js变量的作用域
- js 变量的作用域
- js的变量作用域
- JS的变量作用域
- JS的变量作用域
- js变量作用域链
- js 变量作用域
- js变量作用域
- js变量作用域
- js变量作用域
- js 变量作用域
- JS变量作用域
- 变量的作用功能、作用域和作用形态
- Accelerated C++<4-5>
- 因特网的路由选择协议
- 求N的阶乘
- Win10优化大师1.0 Beta 5发布,跟上微软的节奏
- tensorflow21《TensorFlow实战Google深度学习框架》笔记-09-02 TensorBoard命名空间 code
- js作用域链和变量的作用域
- 51nod 1072 威佐夫游戏(威佐夫博弈)
- 软媒时间3.11正式版发布:天气信息获取更迅速
- springmvc @RequestParam @RequestBody @CookieValue @RequestHeader
- error:Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/_r/fcrtlb8
- remind javaweb数据添加到数据库
- 贡献15本经典C、C++、MFC、VC++教程,都是pdf完整版的
- C语言复习笔记 7
- HDOJ1003