var test='global';
var c=function(){
var test='test';
return {
pre:function(){
console.log(this.test);
return 'ste';
}
}
}();
console.log(c.pre());
这个结果为何是
undefined
ste
这个undefined 是如何出现的,我的理解
题目中c.pre(),不应该是作为属性调用,将pre的作用域挂钩到c的objec上么
this 指向 {
pre:function(){
console.log(this.test);
return 'ste';
} 这个对象,这里面的 test=undefined;
如果写错这样: return {
test:2,
pre:function(){
console.log(this.test);
return 'ste';
}
}
你再看哈效果
这个才是 c,pre()
中的 this
指向的是 c
,不是 global
{
pre:function(){
console.log(this.test);
return 'ste';
}
}
可见,没有 test
属性。
匿名函数中的 var test='test'
只是申明了一个局部变量,不是任何对象的属性。
对于this指针可以这么理解,方法属于那个对象,方法中的this指针就指向哪个对象
{
pre:function(){
console.log(this.test);
return 'ste';
}
上面的json字面量里并没有test这个属性,所以结果为undefined
undefined来自 console.log(this.test);
这里的this是包含了pre方法的那个匿名对象。
你这个时候的this 已经是指向全局了
这个地方我说错了,
var test='global';
var c=function(){
var test='test';
// 你这个时候,返回的是一个对象
return {
pre:function(){
console.log(this.test);
return 'ste';
}
}
}();
c的方法,相当于
var c = {
pre: function() {
console.log(this.test);
return 'ste';
}
};
此时你调用c.pre(),this指向的就是当前对象
还有一种情况,如果你不是直接招行c.pre,而是将它作为参数的话,this就不是指向c对象了
function exec(func) {
func();
}
这个时候打印的this.test就是undefined,此时this已经跑到全局了
// 从上下文看,这里的 this 是 c,但 c 没有 test 属性,所以 c.test 就是 undefined
console.log(this.test);
如果你需要 c.test
输出 test
值,就需要在 return
增加公开访问的属性。
return {
test: test,
pre:function(){
console.log(this.test);
return 'ste';
}
}
如果你需要 c.test
输出 global
值,就要替换函数的接收者
console.log(c.pre.call(this));
希望有所帮助~ :)