javascript解析顺序和变量作用域

javascript解析顺序和变量作用域

作用域:指的就是一段代码的作用范围。
作用域可以提高程序的逻辑性和安全性,减少名字的冲突

一、变量的作用域

1.全局变量

在代码中任何地方都能够访问得到的变量,拥有全局的作用域。
A.最外层韩都外面定义的变量
B.没有定义直接赋值的变量,拥有全局属性

    var name="zhangsan";
    function visit() {
        document.write(name);
    }
    visit();

输出 zhangsan

    var name="zhangsan";
    function visit() {
        document.write(name);
        function visit2(){
            document.write(name);
        }
        visit2();
    }
    visit();

输出 zhangsanzhangsan

2.局部变量

只能在固定的代码片段(函数片段)中访问得到。
A.在函数内部定义的变量

    var name="zhangsan";
    function visit() {
        var name="lisi";
        document.write(name);
    }
    visit();
    document.write(name);

输出 lisizhangsan
B.参数也是局部变量

function f(num) {
    document.write(num);
}
f(1);
document.write(num);

输出 1
然后报错 num is not defined

function f(num) {
    var num=2;
    document.write(num);
}
f(1);

输出 2

二、javascript预解析顺序

A、
B、解析代码运行的环境
C、对标识符(关键字)(var function)进行预解析,解析到相应的环境下
D、如果还有再按照上面的步骤依次解析

    document.write(fruit);
    var fruit="apple";

输出 undefined

    var name="zhangsan";
    function visit() {
        document.write(name);
        var name="lisi";

    }
    visit();

输出 undefined

三、名词解释

(1)环境:

1.宿主环境:(浏览器)
2.执行环境:(所执行的代码在上下文[文档]中的环境)
执行的环境决定了变量和函数的访问权限
A.全局环境
B.函数环境

    var name="zhangsan";
    function visit() {

        var name="lisi";
        document.write(name);
        function  visit2() {
            document.write(name);
        }
        visit2();
    }
    visit();

输出 lisilisi
C.eval();

(2)作用域

一段代码的作用范围。(作用域由环境决定)

(3)作用域链

在一个执行环境中有权访问的变量和函数,能够有机地进行访问

    var name="zhangsan";
    var fruit="apple";
    function visit() {
        var name="lisi";
        document.write(name);
        function  visit2() {
            document.write(name);
            document.write(fruit);
        }
        visit2();
    }
    visit();

输出 lisilisiapple


javascript解析顺序和变量作用域_第1张图片
作用域链

你可能感兴趣的:(javascript解析顺序和变量作用域)