javascript函数作用域
谁能解释为什么这个代码中的结果是[20,20,10,10]:javascript函数作用域,javascript,Javascript,谁能解释为什么这个代码中的结果是[20,20,10,10]: var x = 10; var foo = { x: 20, bar: function () { var x = 30; return this.x; } }; console.log( foo.bar(), (foo.bar)(), (foo.bar = foo.bar)(), (foo.bar, foo.bar)() ); 欢迎链接到规范我认为以下内容将对此有所帮助。前两个函数调用
var x = 10;
var foo = {
x: 20,
bar: function () {
var x = 30;
return this.x;
}
};
console.log(
foo.bar(),
(foo.bar)(),
(foo.bar = foo.bar)(),
(foo.bar, foo.bar)()
);
欢迎链接到规范我认为以下内容将对此有所帮助。前两个函数调用是等效的。他们在
foo
的上下文中调用foo
的bar
方法,因此this.x
返回的值是foo
的x
属性的值,即20
后两个调用的语法都有问题/无效。试着运行你的代码,你会发现它会吐出几个错误,然后完全阻塞。关于它们返回
10
的原因,我的最佳猜测是,它试图在不应该解析代码的情况下解析您的代码,并且正在变得混乱<可能会返回code>10,因为浏览器无法识别您正在尝试执行的操作,并且默认为全局(窗口)范围,x
的值为10
。这也解释了Ramesh Vel的评论,即后两个值在IE中显示为未定义。由于语法无效,不同的JavaScript实现可能会以不同的方式处理它们。无法指出规范,但我强烈建议阅读。这本书将帮助您理解JavaScript的大部分奇怪但伟大的特性
关于你的问题:
函数中的关键字绑定到foo
对象
foo.bar
分配给foo.bar
,但括号会导致返回分配的函数,然后执行
(foo.bar = foo.bar)();
//is the same as
var f = (foo.bar = foo.bar);
f();
//and this also the same as:
var f= foo.bar;
f();
从括号中返回的函数没有绑定到任何对象,因此此
将引用全局对象(对于浏览器)-指向窗口
对象
四,。。该条款(foo.bar,foo.bar)与以下条款完全相同:
a = (3, 4); //last value is returned, first just parsed.
//a contains 4
var f = (foo.bar, foo.bar);
//f contains body of foo.bar function,
f() // is executed in the context of `global` object, eg. `window`.
请阅读JavaScript中函数的绑定。在IE中,输出似乎是20,20,未定义,未定义。。