• 面试题:作用域


    1.

    var foo = 1;
    function ff () {
        alert(foo);
        var foo = 2;
        alert(foo);
        this.foo = 3;
    }
    var m1 = ff();
    var m2 = new ff();

    答案:undefind、2、undefind、2

    不解释

    2.

    var foo = 1;
    function ff () {
        alert(foo);
        var foo = 2;
        alert(this.foo);
        this.foo = 3;
    }
    var m1 = ff();
    var m2 = new ff();

    答案:

    • undefind:变量预解析
    • 1:ff()没有具体事件处理对象,函数内this就指向Window,公有变量又都是Window的属性,那this.foo = 1了
    • undefind:变量预解析
    • undefind:new ff(),是一个新的对象,this不指向window,指向函数本身了,这样this.foo前面没有声明,那么就需要预解析

    3.

    var foo = 1;
    function ff () {
        alert(foo);
        var foo = 2;
        alert(this.foo);
        this.foo = 3;
    }
    var m1 = ff();
    var m2 = ff();

    答案:undefind、1、undefind、3

      最后的答案3:m1的时候,this.foo = 3, 因为this指向的是window,所以已经把var foo = 1,变成3了

    -----------------------------------------------------

    1.

    var a = {'name': 'test'};
    function ff(obj){
        obj.name = 'abs'; 
    }
    ff(a);
    alert(a.name);

    答案:abs

    json是引用类型,所以a作为obj参数传进去,改变它的name属性,外面a的那么也改变

    2.

    var a = {'name': 'test'};
    function ff(obj){
        obj = new Object();
        obj.name = 'abs'; 
    }
    ff(a);
    alert(a.name);

    答案:test

    new Object()后,obj变成一个全新的对象了,obj.name 和外面的a.name 用的也不是一段内存了!

    ----------------------------------------------

     下面代码输出结果:

    var a = 'holle';
    function ff(){
        alert(a+b);
        var b = 'world';
    }
    ff(); alert(a
    +b);

    答案:holleundefind、没有输出(日志会报错)

    函数里,alert 后有b的声明,所有与解析的为undefind,直接alert,因为window下没有声明b 所以报错

    解释的不对请多多指教!

  • 相关阅读:
    eclipse 插件编写(三)(转)
    eclipse 插件编写(二)
    eclipse 插件编写(一)(转)
    js 中的 this 关键字
    js中创建对象的几种方式
    js 如何中如何理解对象?
    项目中的小技巧
    王国维的诗
    uni-app 基础组件
    登庐山 毛
  • 原文地址:https://www.cnblogs.com/niubenbit/p/4323578.html
Copyright © 2020-2023  润新知