博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解JS中的变量作用域
阅读量:6821 次
发布时间:2019-06-26

本文共 1574 字,大约阅读时间需要 5 分钟。

  hot3.png

JS当中一个变量的作用域(scope)是程序中定义这个变量的区域。变量分为两类:全局(global)的和局部的。其中全局变量的作用域是全局性的,即在JavaScript代码中,它处处都有定义。而在函数之内声明的变量,就只在函数体内部有定义。它们是局部变量,作用域是局部性的。函数的参数也是局部变量,它们只在函数体内部有定义。

我们可以借助JavaScript的作用域链(scope chain)更好地了解变量的作用域。每个JavaScript执行环境都有一个和它关联在一起的作用域链。这个作用域链是一个对象列表或对象链。当JavaScript代码需要查询变量x的值时(这个过程叫做变量解析(variable name resolution)),它就开始查看该链的第一个对象。如果那个对象有一个名为x的属性,那么就采用那个属性的值。如果第一个对象没有名为x的属性,JavaScript就会继续查询链中的第二个对象。如果第二个对象仍然没有名为x的属性,那么就继续查询下一个对象,以此类推。如果查询到最后(指顶层代码中)不存在这个属性,那么这个变量的值就是未定义的。

以上的过程并不是我们所熟悉的顺序结构,但大致与顺序结构类似只不过是将作用域当作一个整体来看待而已。整个过程如上图所示

JS作用域实例

代码一(平淡的不能再平淡的代码)

[javascript]

  1. var i=10;   

  2. function a() {   

  3.     alert(i);   

  4. };   

  5. a();   

代码二

[javascript]

  1. var i=10;   

  2. function a() {   

  3.     alert(i);   

  4.     var i = 2;   

  5. };   

  6. a();   

根据“多年”的编程经验你可能觉得这两个代码输出是一样的,但是事实却是第一个代码正常输出了变量的值----10,而第二个代码输出的却是undefined。也许很多人理解不了,但是根据前面的作用域链的图我们就很好理解了。

作用域链图中很明确的表示出:在变量解析过程中首先查找局部的作用域,然后查找上层作用域。在代码一的函数当中没有定义变量i,于是查找上层作用域(全局作用域),进而进行输出其值。但是在代码二的函数内定义了变量i(无论是在alter之后还是之前定义变量,都认为在此作用域拥有变量i),于是不再向上层的作用域进行查找,直接输出i。但是不幸的是此时的局部变量i并没有赋值,所以输出的是undefined。

《JavaScript权威指南》中提出的“没有块级作用域”实际上就是上述的意思。很多时候认为懂了、理解了,其实没有懂,细细的研究一番之后回过头来再书中那加粗的文字,顿时恍然大悟,其实人家书里说的挺清楚的嘛!

详解:http://blog.csdn.net/yueguanghaidao/article/details/9568071

**变量声明提升 只提升声明 不提升赋值 因此如果在之前没赋值就是undefined
**JS没有块级作用域,而是函数作用域,如果没有成功闭包,那么就没有真正隔离开
例如
    var name="global";  
    if(true){  
        var name="local";  
        console.log(name)  
    }  
    console.log(name);  
输出都是local
------------------------------------------------------------------------------
当使用var声明一个变量时,创建的这个属性是不可配置的,也就是说无法通过delete运算符删除
var name=1    ->不可删除
sex=”girl“    ->可删除
this.age=22     ->可删除

转载于:https://my.oschina.net/sheila/blog/389147

你可能感兴趣的文章
HTTPS到底是个什么鬼?
查看>>
Yii框架中ActiveRecord使用Relations
查看>>
leetcode 55.跳跃游戏
查看>>
flexPaper +swftools实现文档在线阅读
查看>>
分形树的绘制
查看>>
获取父页面标签对象,获取当前标签div高度
查看>>
分享10条PHP性能优化的小技巧,帮助你更好的用PHP开发:
查看>>
loadrunner请求中有汉字 如何编码
查看>>
java数据结构 • 面向对象 • 异常 • 随机数·时间
查看>>
springmvc 实现pc端手机端适配(同一个请求根据不同客户端展示不同界面)
查看>>
BTree和B+Tree详解
查看>>
VS2005工程迁移到Eclipse CDT
查看>>
Linux高端内存映射(上)【转】
查看>>
usb_control_msg参数详解【转】
查看>>
8086汇编指令速查手册
查看>>
Node.js安装及环境配置
查看>>
j2EE web.xml中的url-pattern的映射规则
查看>>
华盛顿大学的埃德 拉佐斯卡在一次讲座中提到了一个让人吃惊的数字,如果一个晶体管对应一粒大米,在2004年,每年全球晶体管的生产数量和大米的产量是一样的。...
查看>>
我曾对员工讲,我们做阿里云计算平台,要努力做到让创业者发自内心地相信,在阿里云计算平台上创新、创业,照样可以做成上市公司,甚至会比阿里巴巴还要厉害。有了这样的信任度,云计算才能真正做起来。...
查看>>
(转)前端面试题
查看>>