var x = 10;
var foo = {
x: 20,
bar: function ()
{
var x = 30;
return this.x;
}
};
alert(
(foo.bar = foo.bar)(),
(foo.bar, foo.bar)()
);
为什么
(foo.bar = foo.bar)()
(foo.bar, foo.bar)()
会输出结果10
还是this
的问题呀(foo.bar = foo.bar).bind(foo)()
的结果就是正常的20
(foo.bar = foo.bar)()
相当于 var a = foo.bar; a()
(foo.bar, foo.bar)()
相当于 var a = foo.bar; a()
而在非严格模式,a()
的 this
指针 指向 window
同时 全局变量 var x = 10;
也可以通过 window.x
访问到
于是 a()
就变成了 window.x
也就是 10
了
应该是foo.bar = foo.bar这个赋值操作返回了一个没有调用者的函数,所以这个函数中的this就指向了window。
相当于:
var bar = foo.bar;
alert(bar());
你可以试试看,在foo.bar
里打印一下this
,看看这个情况下,this
指向哪里:
var foo = {
x: 20,
bar: function ()
{
var x = 30;
alert(this === window);//结果是true哦
return this.x;
}
};
顺便再说下,你这个例子都是基于非严格模式
的
doo cm MM~没。 ,.?打开!
.?!
foo.bar = foo.bar
foo.bar , foo.bar
我们来认识一下赋值运算(=)
var a
console.log((a = 1)); // 1
说明赋值运算这个表达式是有返回值的,同理foo.bar这里赋值完了返回只是一个Function。最后相对来说是在window这个作用域下面执行了一个Function而已所以this指向是window。
var a = 1,b = 2;
console.log((a,b)); // 2
分号运算符,单纯的看表达式的话它只是返回最后一个值,还是返回Function,最后相对还是在window作用域下运行。
()
组合运算符,用于提升表达执行优先级别
然后送上操作符优先级地址