一道有趣的javascript题目

2012年3月11日

今天一个同事出了道有趣的javascript题目:

function test() {
    this.t = 1;
    alert(++t+t++);
}
test();

这道题的结果会是4。
那么它的结果为什么不是3,不是5呢?

我个人对此的理解是:
this对象是在运行时基于函数的执行环境绑定的,在这里test方法是一个全局函数,所以this等于window。this.t = 1,相对于window.t = 1。

在这个例子中,函数test()的作用域链包含两个对象:它自己的变量对象(其中定义着arguments对象)和全局环境的变量对象。
接下来解析标识符t时,会沿着作用域链一级一级搜索,先在自己的变量对象中寻找,没找到,然后继续向上级寻找,即在全局环境window的变量对象中查找,找到的就是刚才定义的t=1。
接下来进行运算(++t + t++)这里的2个’++’是一元操作符,优先级高于’+’。
一个是前置型、一个是后置型。执行前置递增时,递增操作是在语句被求值之前就执行了。
整个语句从左到右求值,先算’++t’,变成了2 + t++。
此时的t的值已经变成了2,而后面一个t是后置型的,所以递增操作是在语句被求值之后才执行的。
所以alert的结果是4。
而执行完后的t值变成了3。

虽然这例子就几行代码,但是它考察了很多知识。
执行环境,作用域链,变量对象,this对象,前置递增操作符和后置递增操作符的区别,一元操作符和’+’的优先级。
可以说是麻雀虽小,但是五脏俱全。