这是你认识的this吗?
初识javascript的时候,人们容易把this的理解指向函数的本身。
function foo() { console.log(num) this.count++ } foo.count = 0 var i for (i = 0; i < 10; i ++){ if (i > 5) { foo(i) } } // 9,8,7,6
console.log(foo.count) // 0
运行程序输出了4个值,可以明确的是函数执行了4次,那么问题来了,为什么foo.count => 4?
其实很多人对this都存在着误解。
this到底是什么?
首选我们要对this进行分析,this是变化的。在不同的情况下this的绑定不同的值。那我们首先要了解一下this的绑定的规则。this的绑定规则有一下几种规则:
默认绑定
function foo () {
console.log(this.a)
}
var a = 1
foo()
// 1
可以看出this.a被解析成了全局变量。this绑定在的全局对象上,a自动就成了1。foo()在不带任何修饰的情况下调用绑定了全局对象上,这种绑定称之为默认绑定。
隐式绑定
function foo() {
console.log( this.a )
}
var obj={
a: 2,
foo: foo
};
obj.foo(); // 2
此时的this绑定到了对象obj上了,我们称这种绑定为隐式绑定。隐式绑定的规则是把函数的this绑定到这个上下文的对象中。
显式绑定
function foo() {
console.log( this.a )
}
var obj={
a:2
}
foo.call( obj ) // 2
通过 foo.call(..),我们可以在调用 foo 时强制把它的 this 绑定到 obj 上。
new绑定
function foo(a) {
this.a = a;
}
var bar = new foo(2);
console.log( bar.a ); // 2
此时的this绑定在了fun上,这种通过new方式绑定的this就是new绑定。
优先级
new > 显式 > 隐式 > 默认