一个js的面试题

题目描述

var obj = {
   name:"zhangsan",
   sayName:function(){
     console.info(this.name);
   }
 }
 var wfunc = obj.sayName;
 obj.sayName();//zhangsan
 wfunc();//undefined
 var name = "lisi";
 obj.sayName();//zhangsan
 wfunc();//lisi

题目来源及自己的思路

主要是不太清楚后面3个答案的理由,希望大佬解释一下

阅读 2.1k
4 个回答

第二个不是undefined,是空字符串,window自带name属性

我的理解是:
//先声明变量:
var obj,
var wfunc,
var name,
//在赋值
var obj={}
var var wfunc = obj.sayName;
obj.sayName();//这是取到name的值为zhangsan
wfunc()//此时的this指向window,window中有声明的name,但是未定义,故此时是undefined
name="lisi"//此时name值为lisi
obj.sayName()//this指向obj,故name的值为zhangsan
wfunc()//此时的this指向window,window中有声明的name,并且赋值为lisi

使用obj调用的时候,sayName的上下文对象是obj
重新赋值给wfunc后再执行,上下文对象是window,但是window上没有name属性;
另外,使用var声明的变量在这里提升为全局变量,默认挂载在window对象下,所以这时候上下文对象虽然还是window,但是已经存在name属性了。

var wfunc = obj.sayName;   
//相当于定义了一个变量为wfunc的并且是一个函数,
wfunc = function () {
    console.log(this.name)   //所以this指向window
} 
所以为undefined

obj.sayName();//zhangsan //this指向了obj

var name = "lisi";    //window.name = 'lisi'
obj.sayName();//zhangsan
wfunc();//lisi    
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题