var a=10;
var foo={
a:20,
bar:function(){
var a=30;
return this.a;
}
}
foo.bar()
//20
(foo.bar)()
//20
(foo.bar=foo.bar)()
//10
(foo.bar,foo.bar)()
//10
最后两个this为什么指向window
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
1.foo.bar=foo.bar的返回值是foo.bar的值。
赋值语句的返回值就是赋值的值。
所以 (foo.bar=foo.bar)()等同(function(){var a=30;return this.a;})()对函数的直接调用this是window。
2.(foo.bar,foo.bar)()
逗号运算符,它将先计算左边的参数,再计算右边的参数值。然后返回最右边参数的值。然后同1。
跑不起来呀
(foo.bar)()直接报错了。第一个是对象调用,不必解释。
第二个先看左边的括号,作用是分组,功能和以下功能差不多:
因此调用函数的对象是foo。
第三个左边的括号同样是分组,那么先看下下面的例子:
那么左边括号的赋值返回的就是函数的方法体,即function(){...}这些东西。它没有具体的名字,你可以当做是一个匿名函数,而匿名函数要执行常见有以下几种方式:
一般是前三种,具体可以自己百度下还有那些。由此可以看出右边的括号就是执行匿名函数了,而左边的括号还起到另外一个作用,看第一种匿名函数的执行可知。没有谁调用函数,this指向window。
最后一个需要知道逗号运算符的作用。它返回的是最后一个表达式的值。这里也就是函数的方法体,然后执行匿名函数。而没有谁调用函数的时候,函数中this指向window。