每日3题1下面代码执行后,控制台输出什么?//下面代码执行后,控制台输出什么varfullname="a";varobj={fullname:"b",prop:{fullname:"c",getFullname:function(){returnthis。全名;},},};console.log(obj.prop.getFullname());vartest=obj.prop.getFullname;console.log(test());2下面代码执行后,控制台输出是?//以下代码执行后,控制台输出什么functionFoo(){Foo.a=function(){console.log(1);};this.a=function(){console.log(2);};}Foo.prototype.a=function(){console.log(3);};Foo.a=function(){console.log(4);};Foo.a();letobj=newFoo();obj.a();Foo.a();3下面代码执行后,控制台输出什么?//以下代码执行后,控制台输出什么functiongetName(){for(leti=0;i<5;i++){setTimeout((_)=>{console.log(i);},我*1000);}返回{名称:“aaa”;}}console.log(getName());公众号【我今天也来写bug】更多前端面试题答案与分析1//答:ca//查看这个绑定规则varfullname="a";varobj={fullname:"b",prop:{全名我:"c",getFullname:function(){returnthis.fullname;//普通函数中的this只有在运行时才能判断},},};console.log(obj.prop.getFullname());//隐式绑定:在调用位置有一个context对象:prop,this指向它,所以输出cvartest=obj.prop.getFullname;console.log(test());//默认绑定:独立函数调用,this指向全局对象为window//在浏览器中,var声明的全局变量将成为全局对象的属性//所以test()返回window.fullname=a2//答案:421//调查:PrototypeChain,用new创建对象的过程,函数本身也是一个对象functionFoo(){Foo.a=function(){console.log(1);};this.a=function(){console.log(2);};//new创建对象时,让新创建的对象成为this的上下文//所以这里的this指向下面创建的obj//即属性a}Foo.prototype.a=function(){console.log(3);};//给对象Foo添加属性a:指向一个普通函数Foo.a=function(){console.log(4);};Foo.a();//调用上面函数的普通函数,输出4letobj=newFoo();obj.a();//在构造函数中添加属性a,调用后输出2Foo.a();//创建obj时已经在对象Foo上改变指向属性a,输出13//答案:undefined01234//调查事件循环,return语句functiongetName(){for(leti=0;i<5;i++){setTimeout((_)=>{console.log(i);},我*1000);}//return关键字和返回的表达式之间不能有换行符//即return后要返回的表达式不能换行,否则undefinedreturn{name:"aaa";}}console.log(getName());//1//setTimeout是一个宏任务,这里会在statement1执行完后执行//getName函数返回undefined,所以先输出undefined//setTimeout依次执行后,分别输出01234
