LOADING

【笔记】JavaScript作用域与预解析

作用域


作用域: 在se6之前是没有块级作用域的概念的,se6之后的版本里面才有块级作用域的概念,其作用域与c语言类似,和c语言不同的是JavaScript有作用域链这样的概念:

作用域链: 在JavaScript里面,函数可以嵌套定义,函数内部的子函数存在单独作用域的概念,当子函数内有调用当前作用域内不存在的变量时,则js执行器会向外面最近的作函数内寻找变量,如果不存在,则继续向外查找,就像链子一样。

作用域链案例:

function a() {
    var a = 1;
    function b() {
        function c() {
            console.log(a)
        }
        c();
    }
    b();
}
a();
//输出1

预解析


预解析其实就相当于代码的规范化排列,代码执行之前需要预解析,之后才是顺序执行代码。(此处需注意避免踩坑)
其规律是:先把函数和变量声明放在当前作用与的最前面,然后进行表达式和方法操作
案例:

var a = 18;
f1();
function f1() {
    var b = 9;
    console.log(a);
    console.log(b);
    var a = '123';
}

预解析后:

var a;
function f1() {
    var b;
    var a;
    b = 9;
    console.log(a);
    console.log(b);
    a = '123';
}
f1();
//输出 undefined与9

经典案例

f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){
    var a = b = c = 9;
    console.log(a);
    console.log(b);
    console.log(c);
}

相当于以下代码:

function f1(){
    var a;
    a = 9;//全局变量
    b = 9;
    c = 9;
    console.log(a);
    console.log(b);
    console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);
//输出:
    9
    9
    9
    9
    9
    Uncaught ReferenceError: a is not defined

    发表回复

    电子邮件地址不会被公开。必填项已用 * 标注