关于js的this指向问题和全局对象问题

1.this指向问题,求解答
var obj={
    foo: function () {
        console.log(this);
    }
};
obj.foo();//this指向obj
(obj.foo=obj.foo)();//this指向window,为什么?
(false||obj.foo)();//this指向window,为什么?
2.全局对象覆盖的问题
(function () {
    var a= function () {
        return 10;
    };
    window.a= function () {
        return new a();
    };
    console.log(a());//输出10
})();
下面代码没加立即执行函数输出错误:Uncaught RangeError: Maximum call stack size exceeded,为什么啊,求解答?
var a= function () {
    return 10;
};
window.a= function () {
    return new a();
};
console.log(a());//Uncaught RangeError: Maximum call stack size exceeded

#阿里巴巴##美团##前端工程师#
全部评论
var obj={     foo: function () {         console.log(this);     } }; obj.foo();//this指向obj-- 对象属性调用模式 (obj.foo=obj.foo)();//this指向window-- 函数调用模式 (obj.foo=obj.foo)返回的是函数体: function () {     console.log(this); } (false||obj.foo)();//this指向window-- 同上 (function () {     var a= function () {         return 10;     };     window.a= function () {         return new a();     };     console.log(a());//输出10 })(); 以上代码等价于 window.a= function () {     return new a(); }; (function () {     var a= function () {         return 10;     };     console.log(a());//输出10 })(); 立即执行函数是一个作用域,window对象的a不影响立即执行内的函数调用 var a= function () {     return 10; }; window.a= function () {     return new a(); }; console.log(a()); 首先,第一个匿名函数表达式指定给变量a,然后又用window.a定义,那么前面的a就被覆盖了。所以此时上面一大串就是 window.a= function () {     return new a(); }; console.log(a()); 当调用a时a(),a对象的实例化引起递归(这个不确定。。。。)
点赞
送花
回复
分享
发布于 2016-09-14 19:00
你说的这个问题其实就是没搞懂js的this指向,一句话谁调用的this就指向谁。 1.(obj.foo=obj.foo)();、 (false||obj.foo)(); 这题第一个是将obj.foo整个函数赋值给了obj.foo然后window调用,所以this指向window。 第二个是逻辑或前面false返回后面值,然后立即执行,window调用。 2.这题更简单了,你没发现你去了括号变成死循环了吗
点赞
送花
回复
分享
发布于 2016-09-14 19:01
滴滴
校招火热招聘中
官网直投
thiszhixiang指向于调用当前函数的对象,在一个对象内定义的函数,this就等于这个对象,在全局作用域内定义的函数,如果在全局作用域直接调用,就会指向window, 当然你也可以通过call或者apply来改变函数执行的上下文环境(this指向的对象) 匿名函数的执行,默认this指向于window
点赞
送花
回复
分享
发布于 2016-09-14 19:04
(false||obj.foo())();你这两个括号不对吧
点赞
送花
回复
分享
发布于 2016-09-14 17:12
楼主我看你问的问题都是一些基础的问题,我感觉为了今后长久的发展你最好先去巩固基础,别再钻研这些偏门的题了,要不然这道题会了换一道你还得看半天。我原来基础也特别差,后来使劲在基础上下功夫,才勉强能看懂一些源码。 最后给你出个差不多的题: var length = 10; function fn() { console.log(this.length); } var obj = { length : 5, men:function(fn){ fn(); arguments[0](); } } obj.men(fn,1);
点赞
送花
回复
分享
发布于 2016-09-14 19:39

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务