JavaScript经典做用域问题

  1. 题目javascript

    var a = 10;
    function test(){
        a = 100;
        console.log(a);
        console.log(this.a);
        var a;
        console.log(a);
    }
    test();

    答案:100,10,100
    解析:Javascript在执行前会对整个脚本文件的声明部分作完整分析(包括局部变量),从而肯定变量的做用域,因此在函数test执行前,因为第6行声明了局部变量a,因此函数内部的a都指向已经声明的局部变量,因此第4行输出100。第5行输出this.a,咱们都知道,函数内部的this指针指向的是函数的调用者,在这里函数test被全局对象调用,因此this指针指向全局对象(这里即window),因此this.a = window.a,一开始生命了全局变量a=10,因此第5行输出结果为10。第7行输出结果为100,由于局部变量a在第3行已经被赋值了100,因此直接输出局部变量a的值。html

  2. 题目java

    var a = 100;
    function test(){
        console.log(a);
        var a = 10;
        console.log(a);
    }
    test();

    答案:undefined ,10
    解析:看了第1个例子,可能有同窗会认为输出结果是10 10,可是结果却不是10 10,为何呢?仔细看第1个例子解析的第一句话,Javascript在执行前会对整个脚本文件的声明部分作完整分析(包括局部变量),可是不能对变量定义作提早解析,在这个函数中,执行第3行前,能够认为已经声明了变量a,可是并无定义(这里即赋值),因此第3行输出结果为undefined,执行第4行a =10后,变量a的值就为10,因此第5行输出结果为10。面试

  3. 题目函数

    var a = 100;
    function test(){
        console.log(a);
        a = 10;
        console.log(a);
    }
    test();
    console.log(a);

    答案:100 10 10
    解析:咱们知道在函数内部,通常用var声明的为局部变量,没用var声明的通常为全局变量,在test函数内,a=10声明了一个全局变量,因此第3行的a应该输出全局变量的值,而在函数执行以前已经声明过一个全局变量并赋值100,因此这里第上输出100。第4行给全局变量a 从新赋值10,因此全局变量a的值变成10,因此第5行输出10。而在函数test外部,第8行输出全局变量a的值,由于全局变量被从新赋值为10,因此输出结果即为10。this

注:本文转自 javascript经典面试题 全局变量和局部变量 变量做用域
如需转载,请注明出处:http://www.javashuo.com/article/p-ryjxdwww-gs.html.net

相关文章
相关标签/搜索