getFullName是一个函数,问题(1)中的调用者是person.prop,所以getFullName函数中this在执行person.prop.getFullName()时就指向person.prop,this.fullname就是person.prop.fullname,就是Jane。
而var test = person.prop.getFullName,实际上就是把这个函数单独提出来,再给它起个名字。此时的test与person.prop没有任何关系,所以调用函数test,就不用考虑person.prop。
在浏览器中执行js,有一个潜规则,就是全局变量默认都是内置对象window的属性。所以,var test在全局作用域中,相当于window.test,就好像前面的var fullname = "Anna",就相当于window.fullname,还有person也是一个道理。所以,这里调用test(),等价于window.test(),这样就可以看出,test函数中的this,指向的是window,而window.fullname,它的值是Anna。
关于第三个问题,估计你是被var test = person.prop.getFullName所迷惑。实际上,这里的getFullName是一个函数,但js中函数也跟字符串、数字一样,可以当做变量赋值,所以这是一个赋值操作,函数后面没有加括号。而一旦加括号,就变成了函数调用,意义也就不一样了。不加括号,test和person.prop.getFullName是同一个函数;加了括号,test就变成了person.prop.getFullName执行的返回值了。
代表当前对象啊,js不是有document.getElementByID通过ID获取对象么,this就是获取当前对象,比如id为btn的按钮的onclick方法onclick="method(this)",这个this就是当前按钮对象,作用和document.getElementByID("btn")一样。