js,在函数外部给函数添加一个属性,这个工作原理是怎样的

比如以下代码

<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?

1个回答

你foo函数是直接调用的,函数内this的值是window对象。
this.abc就等于window.abc。和foo.abc没有关系。
this.abc没有被赋值,默认值就是 undefined,之后this.abc++就等于是this.abc = undefined + 1,结果当然是NaN。

jslang
天际的海浪 回复Jef_Zhang: 对。访问一个对象的未定义属性不会报错,而是获得一个默认值undefined
一年多之前 回复
Jef_Zhang
Jef_Zhang 我又试了下,是我理解问题,window下面未定义的对象,window.对象得到的都是undefined,而不是报错.你说的对,我明白了,谢谢你的回答
一年多之前 回复
Jef_Zhang
Jef_Zhang 那我还是有个疑问:我定义了一个foo.abc,为什么window下面也有一个abc?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问