js的作用域
作用域说明:一般理解指一个变量的作用范围
-
全局作用域
(1) 全局作用域在页面打开时被创建,页面关闭时被销毁
(2) 编写在script标签中的变量和函数,作用域为全局,在页面的任意位置都可以访问到
(3)在全局作用域中有全局对象window,代表一个浏览器窗口,由浏览器创建,可以直接调用
(4) 全局作用域中声明的变量和函数会作为window对象的属性和方法保存 -
函数作用域
(1)调用函数时,函数作用域被创建,函数执行完毕,函数作用域被销毁
(2)每调用一次函数就会创建一个新的函数作用域,他们之间时相互独立的
(3)在函数作用域中可以访问到全局作用域的变量,在函数外无法访问到函数作用域内的变量
(4)在函数作用域中访问变量,函数时,会先在自身作用域中寻找,若没有找到,则会到函数的上一级作用域中寻找,一直到全局作用域
作用域的深层次理解
- 执行期的上下文
- 当函数代码执行的前期,会创建一个执行期上下文的内部对象ao(作用域)
- 这个内部的对象是预编译的时候创建出来的 因为当函数被调用的时候 会先进行预编译
- 在全局代码执行的前期会创建一个执行期的上下文的对象GO
函数作用域的预编译
- 创建AO对象 AO{}
- 找形参和变量声明 将变量和形参名当作AO对象的属性名,值为undefined
- 实参形参相统一
- 在函数体里面找函数声明 值赋予函数体
全局作用域的预编译
- 创建GO对象
- 找变量声明 将变量名作为GO对象的属性名 值为undefined
- 找函数声明 值赋予函数体
预编译题目
<script>
function fn(a,c) {
console.log(a);//function
var a = 123
console.log(a);//123
console.log(c);//function
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
}
fn(1,2)
//解题思路
// AO{
// a:undefined 1 function
// c:undefined 2 function
// d:undefined
// b:undefined
// }
</script>