全局作用域
- 全局作用域在页面打开时被创建,关闭时被销毁
- 全局对象window
- 全局作用域中声明的变量和函数会作为window对象的属性和方法保存
函数作用域
- 调用函数时 函数作用域被创建 函数执行完毕 函数作用域被销毁
- 每调用一次函数就会创建一个新的函数作用域 相互独立
- 在函数作用域中可以访问到全局作用域的变量 在函数外部无法访问函数作用域内部的变量
- 在函数作用域中访问变量、函数时 会现在函数作用域内寻找 如果没有 就会到函数的上一级作用域查找 一直找到全局作用域
作用域的深层次理解
执行期的上下文
- 当代码执行的前期,创建一个执行期的上下文的内部对象AO(作用域)
- 这个内部的对象是预编译的时候创建的 因为当函数被调用的时候 会先进行预编译
- 在全局代码执行的前期会创建一个执行期的上下文对象GO
函数作用域的预编译
- 创建AO对象 AO{ }
- 找形参和变量声明 将变量和形参名 作为AO对象的属性名 值为undefined
- 实参和形参的值统一
- 找
函数声明
值赋予函数体
函数声明 function fn( ){ }
函数表达式 var a = function ( ){ }
全局作用域的预编译
- 创建GO对象
- 找变量声明 将变量名作为GO对象的属性名 值是undefined
- 找
函数声明
值赋予函数体
函数声明 function fn( ){ }
函数表达式 var a = function ( ){ }
练习题
function fn(a,c){
console.log(a); // function a(){}
var a = 2;
console.log(a); // 2
console.log(c); // function c(){}
function a(){}
if(false){
var d = 678
}
console.log(d) // undefined
console.log(b) // undefined
var b = function(){}
console.log(b) // function (){}
function c(){}
console.log(c) // function c(){}
}
fn(1,2)
AO{
a undefined 1 function a(){}
c undefined 2 function c(){}
d undefined
b undefined
}
====================================================================================
var a = 10
b = 20
function test (a, b) {
console.log(a, b, test1, d) // 1 undefined test1(){} undefined
var a = 10 // 重新给a 赋值
console.log(a) // 10
if (b) {
var c = 20
}
console.log(a, b, test1, d) // 10 undefined test1(){} undefined
function test1 () {}
var d = function () {} // 重新给d赋值
console.log(a, b, test1, d) //10 undefined test1(){} function() {}
}
test(1)
GO{
a undefined 10
test:function(){}
b 10
AO{
a undefined 1 10
b undefined
c undefined
d undefined function(){}
test1 function(){}
}
}