概述
2019独角兽企业重金招聘Python工程师标准>>>
JavaScript变量对象
-
每一个执行上下文,都有三个重要的属性
-
变量对象
-
作用域链
-
this
-
变量对象
-
变量对象是与执行上下文相关的数据作用域,存储了在执行上下文中定义的变量和函数声明
-
不同执行上下文的变量对象稍有不同
全局上下文
-
全局对象
-
全局对象是预定义的对象,作为JavaScript的全局函数和全局属性的占位符。通过作用全局对象,可以访问所有其他预定义的对象,函数和属性。
-
在顶层JavaScript代码中,可以使用this关键词来引用全局对象。因为全局对象是作用域链的头,这意味着所有非限定性的变量和函数名都会作为该对象的属性来查询。
-
例如,当JavaScript代码引用 parselnt()函数时,他引用的是全局对象的 parselnt 属性。全局对象是作用域链的头,还意味着在顶部JavaScript代码中声明的所有变量都将成为全局对象的属性。
-
-
可以通过this引用,在客户端JavaScript中,全局对象就是Window对象。
console.log (this)
-
全局对象是有Object构造函数实例化的一个对象。
console.log (this instanceof Object)
-
预定义了一堆函数和属性
console.log (this.Math.random()) console.log (Math.random())
-
作为全局对象的宿主
var nub = 1 console.log (this.nub)
-
客户端JavaScript中,全局对象window属性指向自身
var nub = 1 console.log (window.nub) this.window.b =2 console.log (this.b)
函数上下文
-
在函数上下文中,我们用活动对象来表示变量对象
-
活动对象和变量对象其实是一个东西,只是变量对象是规范上的或者说是引擎实现上的,不可在JavaScript环境中访问,只有当进入一个执行上下文中,这个执行上下文的变量对象才会被激活,而只有被激活的变量对象,也就是活动对象上的各种属性才能被访问。
-
活动对象是在进入函数上下文时被创建的,他通过函数的 arguments属性初始化。arguments属性值是Arguments 对象。
执行过程
-
执行上下文的代码会分成两个阶段进行处理:分析和执行,我们也可以叫做:
-
进入执行上下文
-
代码执行
-
进入执行上下文
-
当进入执行上下文的时候,这时候代码还没有执行
-
变量对象包括
-
-
函数的所有行参(如果是函数上下文)
-
由名称和对应值组成的一个变量对象的属性被创建
-
没有实参,属性值设为 undefined
-
-
函数声明
-
由名称和对应值(函数对象(function-object))组成一个变量对象的属性被创建
-
如果变量对象已经存在相同名称的属性,则完全替换这个属性
-
-
变量声明
-
由名称和对应值(undefined)组成一个变量对象的属性被创建
-
如果变量名称跟已经声明的形式参数或者函数相同,则变量声明不会干扰已经存在的这类属性
-
-
-
-
举个例子:
function foo(a){
var b = 2
function c(){}
var d = function (){}
b = 3
}
foo(1)
在进入执行上下文后,这时候的AO是:
AO = {
arguments:{
0:1 ,
length:1
},
a:1,
b:undefined,
c:function (){},
d:undefined
}
代码执行
在代码执行阶段,会顺序执行代码,根据代码,修改变量对象的值
当代码执行完毕,这时候的AO是:
AO = {
arguments:{
0:1 ,
length:1
},
a:1,
b:3,
c:function (){},
d:reference to FunctionExpression "d"
}
总结:
1.全局上下文的变量对象初始化是全局对象
2.函数上下文的变量对象初始化只包括Arguments对象
3.在进入执行上下文时会给变量对象添加形参,函数声明,变量声明等初始化的属性值
4.在代码执行阶段,会再次修改变量对象的属性值
思考题:
-
第一题:
function foo(){
console.log(a)
a = 1
}
foo()// a is not defined
function bar() {
a = 1;
console.log(a);
}
bar()// 1
第一段会报错:Uncaught ReferenceError: a is not defined。
第二段会打印1。
这是因为函数中的a并没有通过 var 关键字声明,所以不会被放在AO中。
第一段执行console的时候,AO的值为:
AO = {
arguments: {
length:0
}
}
没有a的值,就会到全局中去寻找,全局也没有,所以会报错
当第二段执行console的时候,全局对象已经被赋予了a属性,这时候全局就能找到a的值,所以会打印1
第二题:
console.log(foo)// [Function: foo]
function foo(){
console.log('foo')
}
var foo = 1
console.log(foo)// 1
首先会打印函数 而不是undefined。
这是因为在进入执行上下文时,首页会处理函数声明,其次会处理变量声明,如果变量名称跟已经声明的形参或者函数相同,则变量声明不会干扰已经存在的这类属性。
转载于:https://my.oschina.net/u/4052053/blog/3004688
最后
以上就是长情黑裤为你收集整理的JavaScript变量对象的全部内容,希望文章能够帮你解决JavaScript变量对象所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复