一个经典的预解析和作用域的面试题

function Foo() {
getName = function () {
console.log(‘1’);
};
return this;
}
Foo.getName = function () {
console.log(‘2’);

    };
     Foo.prototype.getName = function () {
         console.log('3');

     };

     var getName = function () {
        console.log('4');

     };

     function getName() {
        console.log('5');

    }

    请写出以下输出结果:
     Foo.getName();
     getName();
     Foo().getName();
     getName();
     new Foo.getName();
     new Foo().getName();
     new new Foo().getName();

    function Foo() {
        getName = function () {
            console.log('1');
        };
        return this;
    }
    Foo.getName = function () {
        console.log('2');

    };
    Foo.prototype.getName = function () {
        console.log('3');

    };

    var getName = function () {
        console.log('4');

    };

    function getName() {
        console.log('5');

    }
    /// 1.  ------------------------------------------------------------
    // Foo.getName();运行时题目与解析为下:  故 打印   2 
    function Foo() {
        getName = function () {
            console.log('1');
        };
        return this;
    }

    // var getName;//变量提升 值不提升  但是和第五个函数同名  被覆盖
    function getName() {       //打印5的函数虽然被提升了 但是此时它相当于一个全局变量   而打印4的 getName函数将给打印5的getName函数重新赋值变成
        console.log('4');        //  相当于(var a = 5,  a = 4 可以这样理解)

    }

    Foo.getName = function () {
        console.log('2');

    };
    Foo.prototype.getName = function () {
        console.log('3');

    };

    // 2. ----------------------------------------
    // Foo.getName();
    // getName();运行到这个时 直接打印  4

    //3 .    ----------------------------------------
    // Foo().getName();  运行到这一行时 上面的函数会被解析成下:

    function Foo() {
        getName = function () {    //此时打印1 的函数相当于隐式全局变量  给打印4 的函数从新赋值 变成现在这样
            console.log('1');
        };
        return this;
    }

    function getName() {
        console.log('1');

    }

    Foo.getName = function () {
        console.log('2');

    };
    Foo.prototype.getName = function () {
        console.log('3');

    };
    // Foo.getName();
    // getName();
    // Foo().getName();  打印 1

    // 4.  ----------------------------------------
    // Foo.getName();
    // getName();
    // Foo().getName();
    // getName(); //运行到这一行直接打印 1 


    // 5.  ----------------------------------------

     // Foo.getName();
    // getName();
    // Foo().getName();
    // getName();
    // new Foo.getName(); //简单而言, . 的优先级高于 new ,所以第五问可以看成 new (Foo.getName)(); ,故结果为 2。


    // 6.  ----------------------------------------
    // Foo.getName();
    // getName();
    // Foo().getName();
    // getName();
    // new Foo.getName();
    // new Foo().getName(); // 可以看成  (new Foo()).getName()   (也就是实例对象 可以访问 这个构造函数的prototype属性的任意成员)  故打印 3
    // 7.  ----------------------------------------

    
    // Foo.getName();
    // getName();
    // Foo().getName();
    // getName();
    // new Foo.getName();
    // new Foo().getName();
    // new new Foo().getName();   // 可以看成 new ((new Foo()).getName)();  打印  3 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值