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

#阿里巴巴##美团##前端工程师#
全部评论
thiszhixiang指向于调用当前函数的对象,在一个对象内定义的函数,this就等于这个对象,在全局作用域内定义的函数,如果在全局作用域直接调用,就会指向window, 当然你也可以通过call或者apply来改变函数执行的上下文环境(this指向的对象) 匿名函数的执行,默认this指向于window
点赞 回复 分享
发布于 2016-09-14 19:04
你说的这个问题其实就是没搞懂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
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
楼主我看你问的问题都是一些基础的问题,我感觉为了今后长久的发展你最好先去巩固基础,别再钻研这些偏门的题了,要不然这道题会了换一道你还得看半天。我原来基础也特别差,后来使劲在基础上下功夫,才勉强能看懂一些源码。 最后给你出个差不多的题: 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
(false||obj.foo())();你这两个括号不对吧
点赞 回复 分享
发布于 2016-09-14 17:12

相关推荐

12-04 16:18
已编辑
东华理工大学 前端工程师
面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗  他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了  好好准备,等待明天的影石360和周四的腾讯了  加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务