3道值得收藏的Javascript题目,你理解吗?

在网上看了几道js的题 整理了一下 贴出来 以供参考

第一道:

 function foo() {
        foo.abc = function () { alert('Alibaba') }
        this.abc = function () { alert('Alimama') }
        abc = function () { alert('Alipay') };
        var abc = function () { alert('Taobao') }
    }
    foo.prototype.abc = function () { alert('Alisoft'); }
    foo.abc = function () { alert('Yahoo'); }
    var obj = new foo();
    obj.abc();
    foo.abc();
    abc();

我们就直接针对这输出按顺序进行分析,
执行顺序
1.foo.prototype.abc = function(){alert('Alisoft');}
//这样之后,我们就可以用obj.abc();不懂prototype原型的,可以看这个prototype原型继承
2.foo.abc = function(){alert('Yahoo');}
//alert yahoo
3.var obj = new foo();
//创建一个foo的实例obj,同时,执行了foo函数,也就是obj.abc() = function(){alert('Alimama')}
4.foo.abc = function(){alert('Alibaba')}
//foo.abc是foo类的静态方法,在实例化foo后执行了代码片段foo.abc = function () { alert('Alibaba') }
//覆盖了原来的foo.abc = function(){alert('Yahoo');},所以foo.abc()输出alibaba
5.this.abc = function(){alert('Alimama')}
//这句话把function(){alert('Alimama')赋给了obj.abc,所以obj.abc输出alimama
6.abc = function(){alert('Alipay')};
  var abc = function(){alert('Taobao')};
//这两句一起分析,如果没有下一句,那么abc是个全局变量,abc输出alipay
//但是因为下一句var abc之后,abc的作用域被限制在foo类里,所以外部的abc()会显示未定义
  undefined

第二道:

 

    f = function () { return true; };
    g = function () { return false; };

    (function () {
        if (g() && [] == ![]) {
            f = function f() { return false; };
            function g() { return true; }
        }
    })();

    alert(f()); // true or false ?


答案是false 其实很简单[] == ![]这是两个不同实例的对象, 它们当然不恒等了;其次主要的就是g()是调用的那个方法,它调用局部的 function g() { return true; }而不是全局的 g = function () { return false; }; 所以在这个作用于内 全局的f被覆盖。最终调用的是  f = function f() { return false; };


第三道:

 

var o = {
    m: function() {
        return this.length;
    },
    length: 1
};
var m = o.m;
alert(m()); // 请问输出什么? 并解释为什么。

答案是0 这里的this.length 是对象function的length,而不是对象o的length。如   var m = o; alert(m.m()); 答案就是1,原题的意思同如下代码    var a = function () { return this.length; };alert(a());  或则  var a = function () { };alert(a.length);

 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值