以下代码执行时alert输出值分别是
var foo={
bar:function(){
alert(this);
}
};
(foo.bar)();
(foo.bar,foo.bar)();
(foo.bar=foo.bar)();
(foo.bar,foo.bar)()和(foo.bar=foo.bar)();这种形式是什么意思
以下代码执行时alert输出值分别是
var foo={
bar:function(){
alert(this);
}
};
(foo.bar)();
(foo.bar,foo.bar)();
(foo.bar=foo.bar)();
(foo.bar,foo.bar)()和(foo.bar=foo.bar)();这种形式是什么意思
8 回答4.7k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
这个结果分别是
这里需要说明一下分组运算符、逗号运算符以及赋值运算符的执行过程。
首先逗号运算符会先对左侧表达式进行求值(evaluating)得V,然后调用内部方法GetValue,看V是不是一个Reference,如果不是直接返回V,否则对其解引用,得到最终的结果。之后同样的操作发生在右侧表达式上。最终整个逗号表达式的返回值是右侧表达式的返回值。
赋值运算符对其右侧表达式进行上述操作后得到rval并赋给左侧的变量,整个赋值表达式的返回值则是rval。
上面两个运算符最有一个解引用的过程,因此(foo.bar, foo.bar)得到的是函数
function () { alert(this); }
,之后的调用相当于直接global域调用一个函数,this当然就是window了。分组运算符(也就是小括号)有些不同,它会对其内部的表达式进行求值得到V,但是不会调用GetValue,也就没有了解引用过程,而是直接返回V,因此(foo.bar)就是foo.bar,后面的调用自然就把this绑定到foo之上。