作用域
作用域说明:一般理解指一个变量的作用范围。
一:优先级:
变量>声明普通函数 var a; function a(){} console.log(a)//打印a变量
二:作用域:
全局作用域
1.全局作用域在页面打开时被创建,页面关闭时被销毁
2.编写在script标签中的变量和函数,作用域为全局,在页面的任意位置都可以访问到
3.在全局作用域中有全局对象window,代表一个预览器窗口,由预览器窗口,由预览器创建,可以直接调用
4.全局作用域中声明的变量和函数会作为window对象的属性和方法保存
函数作用域
1.调用函数时,函数作用域被创建,函数执行完毕,函数作用域被摧毁
2.每调用一次函数就会创建一个新的函数作用域,他们之间相互独立的
3.在函数作用域中可以访问到全局作用域的变量了,在函数外无法访问到函数内的变量
4.在函数作用域中访问变量,函数时,会先在自身作用域中寻找,
若没有找到,则会到函数的上一级作用域中寻找,一直到全局作用域
三: 再说作用域:
执行期的上下文
--当函数代码执行的前期 会创建一个执行期上下文的内部对象AO(作用域) --这个内部的对象是预编译的时候创建出来的 因为当函数被调用的时候 会先进行预编译 --在全局代码执行的前期会创建一个执行期的上下文的对象GO
作用域链
--会保存到一个隐式的属性中去[[scope]]这个属性,是我们用户访问不到的 但是的的确确是存在的,让js引擎访问的 里面存储的就是作用域链(AO和GO)
函数执行完作用域链,进行销毁; 再执行,又重新连上
函数作用域 预编译
AO active object
在函数创建时,会创建临时对象AO,方法和变量都会存储到AO里面,
方法AO执行完后,就会被回收掉.
1.创建ao对象 AO{} AO active object 这个AO 2.找形参和变量声明 将变量和形参名 当做 AO对象的属性名 值为undefined 3.实参行参相统一 4.在函数体里面找函数声明 值赋予函数体
全局作用域 预编译
1.创建 GO对象 2.找变量声明 将变量名作为GO对象的属性名 值是undefined
四:来写,道题吧
说出打印的结果?
function fn(a, c) {
console. log(a)
var a=123
console. log( a )
console. log( c)
function a() {}
if (false) {
var d=678
}
console. log(d)
console. log(b)
var b=function(){}
console. log(b)
function c() {}
console. log(c)
}
fn(1, 2)