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。 這是由於在進入執行上下文時,首頁會處理函數聲明,其次會處理變量聲明,若是變量名稱跟已經聲明的形參或者函數相同,則變量聲明不會干擾已經存在的這類屬性。