JS变量作用域难点解析

1. 变量作用域

一个变量的作用域是指程序源代码中定义这个变量的区域 ,换句话说,变量只存在属于它的作用域里,(代码执行)离开了它的作用域,变量将被销毁(变量不能被访问)

2. 代码执行单元

只有一个代码执行单元的所有代码都翻译完成后,才会形成一棵语法树,并解释执行。

一个函数、一个JS文件以及script标签中的代码都属于一个独立的代码执行单元。

3. 变量声明提前

众所周知,Javascript是一种脚本语言,Javascript的执行过程也就是翻译执行的过程,每次翻译执行的单元为包含在”的src属性方式引入)。

Javascript函数里声明的所有变量(函数也是一种变量)都被提前至函数体的顶部,即Javascript引擎执行每一个Javascript代码单元之前,都会首先处理var关键字和function定义式,并把它们提前至函数体的顶部,但请注意,只是声明,不是赋值,所以从源代码的角度看,变量在声明之前就可以使用。

一般来说,声明只是用程序表明变量的类型和名字,而赋值则是为变量分配存储空间,并指定初始值。

4. 全局变量与window

在每个Javascript代码单元都可以引用的变量称之为全局变量,这些全局变量都是window的属性。

在window的初始化过程中,Javascript代码单元会从上到下依次执行,就好像存在一个虚拟的window主函数,这个主函数会依次执行每个Javascript代码单元。从这个角度理解,Javascript的全局变量就是在window对象的主函数里声明的变量。

5. 全局变量与Object

与Java一样,Object是所有Javascript对象的父类(原始对象除外,如(1 instanceof Object)==false),但Object与全局变量根本没什么关系,如果非要说有的话,那么Object也是全局变量,或者说全局变量的类型是Object。

现在网上有很多言论认为,Object.prototype也处于变量作用域链中,这其实是完全错误的,Object.prototype中的属性只用于对象属性的搜索,这完全是面向对象思想中的继承方法的体现。

6. 变量作用域链

Javascript只支持函数变量作用域,那么变量作用域链也必定是函数作用域链,即当定义一个函数时,就自动为此函数保存了一个函数作用域链,如果此函数定义在window的主函数里,那么它的函数作用域链上只有一个对象,即window的主函数作用域,反之,它的函数作用域链的对象依次为它的外部函数的函数作用域、它的外部函数的外部函数的函数作用域、……,直到window的主函数作用域。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值