作用域和作用域链

作用域

每一个作用域在运行时,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)
posted @ 2022-06-12 13:53  a立方  阅读(19)  评论(0编辑  收藏  举报