this的疑惑

jianwu5 2011-10-07 08:28:27
var obj= {
a:1,
b:this.a
};
alert(obj.b);
输出:undefined

这里this指向window:
var a = 0
var obj= {
a:1,
b:this.a
};
alert(obj.b);
输出为0。

但如果将b属性定义为一个方法则没问题:
var obj= {
a:1,
b:function(){return this.a;}
};
alert(obj.b());
输出1,this指向obj。

这是为何?
...全文
257 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangws 2011-10-08
  • 打赏
  • 举报
回复
lz应该看看作用域链
willgeeks 2011-10-08
  • 打赏
  • 举报
回复
11楼分析的很对。
咸鱼boris 2011-10-08
  • 打赏
  • 举报
回复
类的定义有好多种方式,现在比较流行的也是楼主这类的轻量级的定义方式。
楼主这样定义类,在给类属性赋值时,必须那个属性有个实际值,比如属性a的实际值是1,b的实际值是this.b。这就出现了问题,我当前有没有使用obj对象,我的this关键字也不能指向自己的对象实例啊,但是我得给b属性赋值啊,怎么办,this就会去搜索作用域,最后发现window对象可以用,然后就指向它了。
然后就是b:function(){return this.a;}这样为什么可以,因为给b属性赋值的是一个function对象,这个function只是定义了,然后赋给b但并未执行。当调用b时,this发现,我是在obj对象实例下调用的b方法,然后它就乖乖的指向obj对象了
不知道这样说是不是可以通俗易懂些?
liangws 2011-10-08
  • 打赏
  • 举报
回复

var a = 0
var obj= {
a:1,
b:this.a
};
alert(obj.b);
//输出为0

这个例子有错吧,输出的是undefined


function fn(){
alert(this.a);
}

有两种情况
1,new fn();//this指向函数本身
2,fn();//this指向相对于当前作用域的父级作用域,所以在这里是window;
如果以下情况

a = "123";
function fn(){
this.a = "111"
function fn1(){
alert(this.a);
}
fn1(); //这时候this指向的是fn这个作用域中的a,而并不是window下的a
}

Crazywa 2011-10-08
  • 打赏
  • 举报
回复
javascript的变量作用域用 function(){}来划分。
而其他语言的变量作用域用 大括号{}来划分。
你那个this,是在全局下的,那就是window。
gmemai 2011-10-08
  • 打赏
  • 举报
回复
this 这个东西是为了方便访问调用当前函数的对象而存在的

this是指向函数的调用者(call/apply方法除外)。在全局下,调用者就是window。

var obj = {a:this.b};
实际上是将this.b赋值给obj的a属性。而这个时候的this是window。
var obj = {a:function(){this.b}}
是将function赋值给obj的a属性,然后 obj.a();的时候,调用者就是obj,所以this就是obj。
类的定义有好多种方式,现在比较流行的也是楼主这类的轻量级的定义方式。
楼主这样定义类,在给类属性赋值时,必须那个属性有个实际值,比如属性a的实际值是1,b的实际值是this.b。这就出现了问题,我当前有没有使用obj对象,我的this关键字也不能指向自己的对象实例啊,但是我得给b属性赋值啊,怎么办,this就会去搜索作用域,最后发现window对象可以用,然后就指向它了。
然后就是b:function(){return this.a;}这样为什么可以,因为给b属性赋值的是一个function对象,这个function只是定义了,然后赋给b但并未执行。当调用b时,this发现,我是在obj对象实例下调用的b方法,然后它就乖乖的指向obj对象了
学习了
soommm 2011-10-08
  • 打赏
  • 举报
回复
呵呵 楼主js新手吧。this 这个东西是为了方便访问调用当前函数的对象而存在的。 新人可以这么理解。

你的代码没有在函数里面 那么他的this就是window
全局下面的 var定义的东西实际上是window下面的属性

function fun (){}


这种定义的函数我们调用他 那么他里面的this也是window

当然 我们可以改变这个this的只 我们有call 和apply
jianwu5 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sharkdbj 的回复:]

类的定义有好多种方式,现在比较流行的也是楼主这类的轻量级的定义方式。
楼主这样定义类,在给类属性赋值时,必须那个属性有个实际值,比如属性a的实际值是1,b的实际值是this.b。这就出现了问题,我当前有没有使用obj对象,我的this关键字也不能指向自己的对象实例啊,但是我得给b属性赋值啊,怎么办,this就会去搜索作用域,最后发现window对象可以用,然后就指向它了。
然后就是b:fun……
[/Quote]
应该是这样。
不过,我还不是很明白对象链~~
Crazywa 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jianwu5 的回复:]

引用 9 楼 crazywa 的回复:

javascript的变量作用域用 function(){}来划分。
而其他语言的变量作用域用 大括号{}来划分。
你那个this,是在全局下的,那就是window。

那为什么同是obj对象,方法中的this能准确指向obj,而属性则指向window?
[/Quote]

this是指向函数的调用者(call/apply方法除外)。
在全局下,调用者就是window。

var obj = {a:this.b};
实际上是将this.b赋值给obj的a属性。而这个时候的this是window。
var obj = {a:function(){this.b}}
是将function赋值给obj的a属性,然后 obj.a();的时候,调用者就是obj,所以this就是obj。
fox123871 2011-10-08
  • 打赏
  • 举报
回复
代表当前对象 例如 input select等控件的 实例! 等效使用!
jianwu5 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 crazywa 的回复:]

javascript的变量作用域用 function(){}来划分。
而其他语言的变量作用域用 大括号{}来划分。
你那个this,是在全局下的,那就是window。
[/Quote]
那为什么同是obj对象,方法中的this能准确指向obj,而属性则指向window?
jianwu5 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 liangws 的回复:]

JScript code

var a = 0
var obj= {
a:1,
b:this.a
};
alert(obj.b);
//输出为0


没错,是输出0,在ie和ff下都是报0
sirzxj 2011-10-08
  • 打赏
  • 举报
回复
mark,学习
风一样的大叔 2011-10-08
  • 打赏
  • 举报
回复
学习下
九月 2011-10-07
  • 打赏
  • 举报
回复
帮顶 看来楼主已经找到答案里。。。
jianwu5 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 blue_lg 的回复:]

引用 5 楼 jianwu5 的回复:

引用 1 楼 fanchuanzhidu 的回复:

楼主你这不是自己理解的挺好么 没有什么为什么 这就是js

顺便问怎么结贴,我发帖的时候说我之前有2个贴未结。

在左边我的未结的帖子里,有结贴的按钮的吧。。。。
[/Quote]
多谢,在我的社区找到了。
BLUE_LG 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jianwu5 的回复:]

引用 1 楼 fanchuanzhidu 的回复:

楼主你这不是自己理解的挺好么 没有什么为什么 这就是js

顺便问怎么结贴,我发帖的时候说我之前有2个贴未结。
[/Quote]
在左边我的未结的帖子里,有结贴的按钮的吧。。。。
jianwu5 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fanchuanzhidu 的回复:]

楼主你这不是自己理解的挺好么 没有什么为什么 这就是js
[/Quote]
顺便问怎么结贴,我发帖的时候说我之前有2个贴未结。
jianwu5 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 butcher2002 的回复:]

晕了
这里this指向window:
var a = 0
var obj= {
a:1,
b:this.a
};
alert(obj.b);
输出为0。

是因为你定义了a 跟this不this的没任何关系~~~
a:1没任何意义~~~ 你没有定义a,当然报undefined了
var a = 0
var obj= {
b:this.a
};
alert(obj.……
[/Quote]
我的第二个例子是说明第一个例子中this指向了window。如果不在全局定义a则报undefined,而不是自己理解的obj!
butcher2002 2011-10-07
  • 打赏
  • 举报
回复
晕了
这里this指向window:
var a = 0
var obj= {
a:1,
b:this.a
};
alert(obj.b);
输出为0。

是因为你定义了a 跟this不this的没任何关系~~~
a:1没任何意义~~~ 你没有定义a,当然报undefined了
var a = 0
var obj= {
b:this.a
};
alert(obj.b);
你试试看~~
加载更多回复(2)

87,990

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧