JavaScript变量对象javascript
console.log (this)
全局对象是有Object构造函数实例化的一个对象。java
console.log (this instanceof Object)
console.log (this.Math.random()) console.log (Math.random())
var nub = 1 console.log (this.nub)
var nub = 1 console.log (window.nub) this.window.b =2 console.log (this.b)
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.在代码执行阶段,会再次修改变量对象的属性值
思考题:dom
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。 这是由于在进入执行上下文时,首页会处理函数声明,其次会处理变量声明,若是变量名称跟已经声明的形参或者函数相同,则变量声明不会干扰已经存在的这类属性。