求教 javascript 的 this 的指向问题

2014-05-05 19:06:02 +08:00
 forreal
刚学javascript,看到《javascript语言精粹》中提到以函数调用模式调用函数时,this被绑定到全局对象。于是验证了一下,但是结果不太对劲,求教问题出在哪里?
代码如下:
var g = 'global';
function tryit() {
var g = 'self';
console.log(this.g);
}
tryit();

运行结果是 undefined
ide是webstorm
2883 次点击
所在节点    Node.js
14 条回复
Mutoo
2014-05-05 19:11:11 +08:00
运行的结果是 undefined 没错,因为 tryit 并没有返回值。但是会在控制台打印"global"。
forreal
2014-05-05 19:15:57 +08:00
@Mutoo
但是代码改成
var g = 'global';
function tryit() {
g="cool"
console.log(6);
}
tryit();

结果就变成6了。
Mutoo
2014-05-05 19:27:51 +08:00
目测你是以 node 方式运行。那样的话 js 是以模块的方式被运行的,this 指向的是 node module。建议你用 Javascript Debug 模式运行。
RIcter
2014-05-05 19:29:00 +08:00
顺带问一个(/ω\)
var a = {
a: 1,
b: this.a
}
如何让a.b的值为a.a。如上方法并不可以。目前我的解决方法是b: window.a.a
sd4399340
2014-05-05 19:33:47 +08:00
http://bonsaiden.github.io/JavaScript-Garden/zh/#function.this

ES5 注意: 在严格模式下(strict mode),不存在全局变量。 这种情况下 this 将会是 undefined。
forreal
2014-05-05 19:40:30 +08:00
@Mutoo

@sd4399340

真的是node原因,我把结果写在html页面里就和预想的一样了。
forreal
2014-05-05 19:40:58 +08:00
@Mutoo
@sd4399340
多谢
NemoAlex
2014-05-05 20:37:14 +08:00
@RIcter
var a = {
a: 1,
b: this.a.a
}
shichimiya
2014-05-05 20:43:59 +08:00
@RIcter
var a = {
缩缩a: 1,
缩缩b: eval(a.a)
}
zzNucker
2014-05-05 20:44:24 +08:00
@RIcter
var a = {
a: 1,
b: function(){return this.a}
}

function才会新建一个执行环境。单纯一个{}是没有执行环境的,也就是你肯定知道的“js没有块级变量”。
RIcter
2014-05-05 20:57:30 +08:00
@NemoAlex 这种方法和window一样..
@shichimiya 被萌到!
@zzNucker 感谢=A=..
arzusyume
2014-05-06 09:11:25 +08:00
otakustay
2014-05-06 11:33:30 +08:00
node是因为在你的这段代码外面包了一层function,这层里面有module、exports、require这些,所以事实上你的var g并不是在global scope里的……

~/Dev/test ⌚ 11:33:17
$ cat test.js
console.log(arguments.callee.toString());

~/Dev/test ⌚ 11:33:21
$ node test.js
function (exports, require, module, __filename, __dirname) { console.log(arguments.callee.toString());

}
aec4d
2014-08-08 22:31:27 +08:00
@RIcter
对象的属性可以使用存储函数set/get定义
http://javascript.ruanyifeng.com/stdlib/object.html#toc11
a = {
a : 1,
get b(){return this.a},
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/111245

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX