作用域和作用域链
作用域
每一个作用域在运行时,js引擎会先把作用域内部的关键字隐式提前扫描,并声明;对象内部的不会隐式提升
同名标识符提升问题
先提升变量后提升函数
var a = 30;
function a() {
console.log(100)
}
console.log(a);
变量变量同名(有些语言错误)
console.log(a); // undefined
var a = 10;
console.log(a) // 10
var a = 20;
console.log(a) // 20
标识符三种写法
形(形参和变量)实(实参赋值)函(函数提升)运行
var a = 20; // 1种
function fn(a) { // 3种
var a = 100
function a() {
console.log(666)
}
} //2种
函数运行时的作用域在哪儿,函数在生成(定义和声明)时 所在用的作用域
var a = 10;
function fn() {
var a = 30;
function fm() {
console.log(a)
}
return fm()
}
var b = fn();
b() // 30 在外面调用,但是在声明的地方运行
作用域链
函数生成就会有个属性[[scopes]],作用域对象(只能引擎使用)
函数调用时生成AO对象,会把AO对象放在scopes里,每次调用都会放在scopes前面()
js对象有两种成员
一种是上下文成员
一种是下文成员(底层语法访问的成员)
console.dir(fn)//这个‘对象’保存的就是函数的作用域
函数在定义和声明的时候就有[[scopes]],里面保存了上层的AO对象,保存在scopes对象内部的
function fn() {
var a = 30;
function fm() {
}
}
fn(100)
fn(200)