• 原生JS判断作用域输出值


    js引擎运行

    第一次解析(也称预解析):变量提升(含函数表达式)和函数提升

    1️⃣ 前提是在作用域function或script情况下
    2️⃣ 只提升变量名到当前作用域最顶端,不赋值不调用
    3️⃣ 检查语法错误(如有则都不执行)

    第二次解析:代码运行

    从上到下,检查运行错误(如有则不再往下执行)

    作用域题目练习

    请描述下面代码的输出结果以及运行原因

    (作用域链表)

    题一

    console.log(a);
    var a = 10;
    console.log(a);
    var a = 20;
    console.log(a);
    b();
    var b = function() {
        console.log(a);
    }
    

    一解

    /* 相当于执行以下代码 */
    var a;
    console.log(a); // a无赋值,undefined
    a = 10;
    var a;
    console.log(a); // 10
    a = 20;
    console.log(a); // 20
    var b;
    b();            // 没有赋值就直接调用。Error报运行错误:b is not a function
    b = function() {
        console.log(a);
    }
    

    题二

    var num = 10;
    fun();
    function fun() {
        console.log(num);
        var num = 20;
    }
    

    二解

    /* 相当于执行了以下操作 */
    var num;
    function fun() {
        var num;
        console.log(num);  // undefined
        num = 20;
    }
    num = 10;
    fun();
    

    题三

    var num = 10;
    
    function fn() {
        console.log(num);  
        var num = 20;
        console.log(num);  
    }
    fn();
    

    三解

    /* 相当于以下代码 */
    var num;
    function fn() {
        var num;
        console.log(num);  // underfined
        num = 20;
        console.log(num);  // 20
    }
    num = 10;
    fn();
    

    题四

    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);  // undefined
        console.log(b);  // 9
        a = '123';
    }
    a = 18;
    f1();
    

    题五

    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); 
    }
    

    五解

    /* 相当于执行以下代码 */
    b=9;
    c=9;
    function f1() {
        var a = 9;  // 区别集体声明变量var a=9, b=9, c=9;
        b = 9;  // 函数作用域内无声明则b、c为全局变量
        c = 9;
        console.log(a);  // 9
        console.log(b);  // 9
        console.log(c);  // 9
    }
    f1();
    console.log(c);  // 9
    console.log(b);  // 9
    console.log(a);  // Error报错:a没有被定义undefined
    

    题六

    var num = 1;
    function demo() {
        console.log(num); 
        function test() {
            console.log(num); 
            num = 3;
            console.log(num); 
        }
        var num = 2
        test();
    }
    demo();
    

    六解

    /* 相当于执行以下代码 */
    var num;
    function demo() {
        var num;
        console.log(num); // underfined
        function test() {
            console.log(num); // 2
            num = 3;
            console.log(num); // 3
        }
        num = 2;
        test();
    }
    num = 1;
    demo();
    


    作者:MaricoCheung
    出处:http://www.cnblogs.com/MaricoCheung/
    ——有心人做有心事哦,晚安EmilyChen!

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    #include "stdafx.h" 错误?
    扩频技术
    求数组中只出现一次的数字(算法)
    1.3一摞烙饼的排序
    嵌套类
    企业级邮件服务软件推荐
    关于Linq To Sql中Detach方法和一个公共基类
    asp.net(c#) 将dbf转换为xls或wps,并将数据的列名改成中文;并判断本机是否安装office2003,2007和wps2007,2010
    一句代码解决IE8兼容问题(兼容性视图)
    asp.net(C#)套用模板操作Excel
  • 原文地址:https://www.cnblogs.com/MaricoCheung/p/13756646.html
Copyright © 2020-2023  润新知