JavaScript权威指南(第6版) --- 自学笔记(18) --- 作为属性的变量、作用域链

作为属性的变量
当声明一个js全局变量时,实际上是定义了全局对象的一个属性。
当使用var声明一个变量时,创建的这个属性时不可配置的(后面会解释),也就是说这个变量无法通过delete运算符删除。
如果没有使用严格模式,并给一个未声明的变量赋值的话,js会自动创建一个全局变量,以这种方式创建的变量时全局变量的正常可配置属性,并可以删除他们。

var globalWithVar = "123";
globalAuto = "456";
this.globalAuto1 = "789";
console.log("globalWithVar = " + globalWithVar);
console.log("globalAuto = " + this.globalAuto);
console.log("this.globalAuto1 = " + this.globalAuto1);
console.log("-------------------------------------");
delete globalWithVar;
delete globalAuto;
delete this.globalAuto1;
console.log("globalWithVar = " + globalWithVar);
console.log("globalAuto = " + this.globalAuto);
console.log("this.globalAuto1 = " + this.globalAuto1);

ECMAScript规范中强制规定,js全局变量是全局对象的属性。 局部变量没有这种规定,局部变量可以看做为跟函数调用相关的某个对象的属性,在ECMAScript 3规范该对象称为"调用对象"。ECMAScript 5规范该对象称为"声明上下文对象"。
js可以允许使用this关键字来引用全局对象,但没有方法可以引用局部变量中存放的对象,这种存放局部变量的对象的特有性质,是一种我们不可见的内部实现。

作用域链
js是基于词法作用域的语言:通过阅读包含变量定义在内的数行源码就能知道变量的作用域,全局变量在程序中始终有定义的,局部变量在声明它的函数体内以及其所嵌套的函数内始终有定义的。

如果将一个局部变量看做是自定义实现的对象的属性的话,那么可以换个角度来解读变量的作用域。
每一段js代码(全局代码或函数),都有一个与之相关联的作用域链,这个作用域链是一个对象列表或者链表,这组对象定义了这段代码"作用域中"的变量。
当js需要查找变量x的值得时候(这个过程叫变量解析),它会从链中的第一个对象开始查找,如果这个对象有一个名为x的属性,则会直接使用这个属性的值;如果第一个对象不存在名为x的属性,js会继续查找链上的下一个对象;如果第二个对象也没有,则会继续查找下一个对象;以此类推,如果作用域链上没有一个对象含有属性x,则认为该段代码的作用域链上不存在x,并抛出一个引用错误的异常。

在js的最顶层代码中(即不包含在任何函数定义内的代码),作用域链由一个全局对象组成。
在不包含嵌套的函数体内,作用域链上有两个对象,第一个是定义函数参数和局部变量的对象,第二个是全局对象。
在一个嵌套的函数体内,作用域链上的对象至少有三个对象。

理解作用域链的创建规则非常重要:
当定义一个函数时,它实际上保存一个作用域链,当调用这个函数时,它创建一个新的对象来存储它的局部变量,并将这个对象添加至保存的那个作用域链上,同时,创建一个新的更长的表示函数调用作用域的链。
对于嵌套函数来讲,事情变得更有趣,每次调用外部函数时,内部函数又会被重新定义一遍,因为每次调用外部函数时,作用域链都是不同的,内部函数在每次定义的时候,都有微妙的差别,在每次调用外部函数的时候,内部函数的代码都是相同的,而关联这段代码的作用域链不相同。

作用域链对于理解with语句非常有帮助,同时,对于理解闭包的概念也至关重要。
with语句和闭包后续会说明。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值