第二部分 this和对象原型
this 并不像我们所想的那样指向函数本身。
function foo(num){
console.log("foo:"+num);
this.count ++
}
foo.count =0
var i;
for(var i=0;i<10;i++){
if(i<5){
foo(i)
}
}
console.log(foo.count);
// foo: 6
// foo: 7
// foo: 8
// foo: 9
// foo 被调用了多少次?
console.log( foo.count ); // 0 -- WTF?
回避这个问题并使用其他方法来达到目的,比如创建另一个带有count 属性的对象。
词法作用域:
function foo(num){
console.log("foo:"+num);
data.count ++
}
var data = {
count:0
}
for(var i=0;i<10;i++){
if(i<5){
foo(i)
}
}
console.log(data.count);
foo:0
foo:1
foo:2
foo:3
foo:4
5
另一种解决方法是使用foo 标识符替代this 来引用函数对象:
function foo(num){
console.log("foo:"+num);
foo.count ++
}
foo.count =0
var i;
for(var i=0;i<10;i++){
if(i<5){
foo(i)
}
}
console.log(foo.count);
另一种方法是强制this 指向foo 函数对象:
function foo(num){
console.log("foo:"+num);
this.count ++
}
foo.count =0
var i;
for(var i=0;i<10;i++){
if(i<5){
foo.call(foo,i)
}
}
console.log(foo.count);
foo:0
foo:1
foo:2
foo:3
foo:4
5