比如以下代码
<script>
function foo(num) {
console.log( "foo: " + num );
console.log( window.abc );
// 记录 foo 被调用的次数
this.abc++;
}
foo.abc = 2;
var i;
for (i=0; i<10; i++) {
if (i > 7) {
foo( i );
}
}
//foo: 8
//undefined
//foo: 9
//NaN
//2
//NaN
console.log( foo.abc ); // 2 -- WTF?
console.log( abc ); // NaN -- WTF?
</script>
为什么我在函数外部给函数定义一个属性的时候,也会把这个属性定义到函数上级作用域(window)下面呢?而且,为什么,第一次打印的时候,window下面的abc属性是undefined,从第二次开始就成了NaN?
你foo函数是直接调用的,函数内this的值是window对象。
this.abc就等于window.abc。和foo.abc没有关系。
this.abc没有被赋值,默认值就是 undefined,之后this.abc++就等于是this.abc = undefined + 1,结果当然是NaN。