关于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

相关推荐

25实习面试初体验,面前紧张的不行,但是面试官人巨好,体验贼棒,不会的地方耐心解答,算法也会指导。55分钟。复盘一下:1.项目的地图功能介绍一下2.JS中的this如何工作(答了四种绑定方式)3.const let var4.js如何实现深拷贝 浅拷贝5.深拷贝要注意哪些情况?6.排除了一切特殊情况,最简单的深拷贝?    回答的是递归,面试官说应该是JSON.parse(JSON.stringify(xxx)) 。我说没办法考虑undefined和symbol,面试官说实际不会有那么多symbol。确实是的,记住了7.箭头函数和普通函数的区别8.CSS盒模型介绍一下9.flex布局介绍一下,还有常用属性,以及作用10.CSS的选择器以及优先级11.样式嵌套的时候选择器优先级怎么计算?(这个真忘了)12.HTTP状态码 404 301 302 500,哪些场景会用到13.301和302浏览器接受到这两个状态码行为上会有什么差异?(不会)    301,代表 永久重定向,也就是说第一次请求后,下次浏览器再去请求的话,不会向服务器请求了,而是直接从浏览器的缓存里拿     302,代表 临时重定向,也就是说每次去请求都会请求服务器(除非响应中用 Cache-Control 或 Expired 暗示浏览器缓存)14.介绍一下http协议,有哪些特性15.http请求结束默认会关闭连接,如何保持连接?(keep-alive)16.http的无状态体现在哪里?(答不全)    无状态是指,同一个会话的连续两次请求之间相互不了解。也就是说,第二次请求发送的时候,服务器会响应,但是不会记住你是谁。所以如果需要使用之前的信息,每次都要将完整的数据和上下文发送。17.v-if和v-show区别18.Vue组件间通信方式19.讲一下同源策略和解决跨域问题的方式20.postMessage如何实现跨域?(不会)    a域向b域发消息,会在a域的页面下埋一个b域的页面,发消息的窗口使用postMessage,接收的窗口使用message监听即可21.实战中有做过性能优化吗算法:1.单词逆序输出(简单题)2./../a/./这种路径做一个过滤,本菜鸡不太会,但是全程引导做出来了反问#阿里控股集团#
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务