首页 技术 正文
技术 2022年11月15日
0 收藏 759 点赞 4,388 浏览 1757 个字

变量对象

先来说说什么是变量对象。变量对象中又存储了什么东西吧。

JavaScript中的运行环境包含全局运行环境和函数运行环境这两种,每进入到一个运行环境都会创建一个变量对象,这个对象中记录了在当前运行环境中能够訪问到的变量,它们以变量对象的属性形式存在。也就是说这个变量对象成为“作用域”这个抽象概念的实体。

同一时候,变量对象中的属性记录是有一定先后顺序的。而且属性值究竟是实际的值还是undefined也是分阶段的(进入上下文(函数開始调用,但还未运行内部的详细代码)。运行代码阶段)。

1. 在全局环境中:

(1)函数声明

(2)变量声明—其值为undefined,一直到运行到这条语句的时候才被赋予详细值。

2. 函数环境中:

在进入运行环境的时候,变量对象会进行例如以下初始化:

(1)arguments对象,对象中的值被赋予详细的实參值

(2)函数的形參:变量对象的一个属性。其属性名就是形參的名字。其 值就是实參的值;对于没有传递的參数,其值为undefined。

(3)函数声明:变量对象的一个属性。其属性名和值都是函数对象创建出来的,其值为指向某个函数对象的引用;

(4)变量声明:变量对象的一个属性,其属性名即为变量名。其值为undefined。

而在运行到函数内部的详细某个语句的时候。上面所述的值为undefined的变量。其值都会被赋予详细的值。

总结一句话:在进入上下文的时候(比方进入到一个全局环境或者是调用某个函数),变量对象除了arguments。函数的声明,以及參数被赋予了详细的属性值,其他的变量属性默认的都是undefined。

关于声明提升

**

JavaScript具有“声明提升”的特性。使用function或var进行的声明会被提升至当前作用域的顶端。

**

事实上理解这句话能够从进入到一个运行环境后都发生了什么来看,正如上面所说。进入到一个上下文后,声明的函数(值为函数对象的引用)和变量(其值为undefined)都被记录在了变量对象中。到了运行代码阶段,一边在作用域链中搜索标识符,一边运行到某个语句后把原本进入上下文阶段值为undefined的变量更换为详细的值。

函数声明提升

看看第(3)条,在进入到运行环境的时候。函数声明就会被加入到变量对象中,其相应的属性值是指向所声明的函数对象的引用,假设在函数声明的语句之前存在一条函数调用语句,引擎会在作用域中搜索该标示符。而且在变量对象中成功查找到了声明的函数名,其值也是存在的,即指向创建的函数对象的引用。因此这样写代码不会报错,成功调用了函数。

而通过函数表达式方式,也就是说不是以function开头,而是把函数赋值给了某个变量,由于在进入上下文阶段是不会给变量赋予详细的值的(參看第(4)条),所以这个时候该变量的值为undefined,要等到运行代码阶段,运行到这条语句后才会将其值更换为指向函数对象的引用,因此假设调用函数的语句在前面则会报错。此时在变量对象中搜索标识符。其值还是undefined,当然不能成功调用了。

再来看一个变量声明提升的样例

var a = "Hello";
function b() {
alert(a); //undefined
var a = "World";
alert(a); //World
}
b();

为什么运行了b(),第一个alert(a)是undefined呢?来看看进入到全局运行环境中发生了什么。全局环境的变量对象被填充为:

VO={

       b:指向一个函数对象的引用,

       a:undefined—>运行到该句话后变成”hello”

}

再来看看调用b()发生了什么,其变量对象被填充为:

VO={

        arguments:{},

        a:undefined—->运行到详细语句后才被赋值为“world”

}

注意到第一次运行到 alert(a)时会在当前作用域中搜索标识符a,发现已经存在一个a(则不会再沿着作用域链往外层搜索了),其值是undefined。而运行到var a = “World”;时则被替换为了详细的值。

假设在b中去掉var。则会沿着作用域链搜索到全局环境中的变量a。那么两个alert(a)都会输出“hello”。

參考资料:javascript 运行环境。变量对象,作用域链

JavaScript中的作用域与变量声明提升

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,084
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,559
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,408
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,181
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,818
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,901