每日3题1下面代码执行后,控制台输出什么?varfoo=functionbar(){return123;};console.log(typeoffoo);console.log(typeoffoo());console.log(typeofbar());2以下代码执行后,输出是?varobj={a:1,foo:function(){returnthis.a;},};varfun=obj.foo;console.log(obj.foo());console.log(fun());3下面代码执行后,控制台输出什么?函数A(x){this.x=x;}函数B(x){this.x=x;}A.prototype.x=1;B.prototype=newA();vara=newA(2);varb=newB(3);deleteb.x;console.log(a.x);console.log(b.x);分析1、答案:函数号错误分析:这是一个命名函数表达式,被函数表达式代替赋值的变量类型是function,所以typeoffoo是functionfoo,调用后返回123,所以类型是number。关于命名函数表达式,这个在MDN文档中是这样描述的:命名函数表达式(Namedfunctionexpression)要在内部引用当前函数,需要创建一个命名函数表达式。那么这个函数名会(并且只会)在函数体中(作用域内)作为局部变量名使用函数表达式的函数名只在其函数体中有效,所以在外面调用bar()会报错error2.Answer:1undefined直接调用obj.foo(),前面是obj的引用。当函数引用具有上下文对象时,隐式绑定规则会将函数调用中的this绑定到上下文对象。因为this在调用obj.foo()时绑定了obj,this.a和obj.a一样,所以结果为1。fun虽然是obj.foo的引用,但是指的是foot函数本身,所以fun()其实是一个没有任何修饰的函数调用,此时应用默认的绑定规则,即this指向全局对象。全局对象没有属性a,所以输出undefined3。答案:2undefined调查原型链。JS中的每个函数都有一个原型属性,它指向一个对象(称为原型对象)。每个对象都有一个__proto__属性。指向对象的构造函数的原型对象也有__proto__属性,所以一个对象可以向上走__proto__层,直到一个对象的原型对象为null,null没有原型,是原型链的终点.当对象的属性不存在时,如果对象中不存在该属性,它将沿着原型链寻找该属性,直到到达原型链的末端。回到主题:a.x,对象a上的属性x为2,所以输出2b.x,对象b上的属性x被删除,所以查找,先看b.__proto__,即B.prototype,即newA(),因为没有传入x,所以x是undefined,找到属性x,最后返回undefined公众号【今天也写了个bug】
