被误解的this
1.this指向自身
function foo(){
console.log(this)
}
foo()//this指向全局对象window(非严格模式),而不是foo()
2.this指向它的父函数
function foo(){
function fn(){
console.log(this)
}
fn()
}
foo()//this依然指向全局对象window(非严格模式),而不是foo()
如何判断函数中this的绑定
this不是在编写时绑定的,而是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用,根据以下四条调用规则可以判断this的绑定对象
1.不加任何修饰独立调用函数,this在非严格模式下绑定全局对象(window),严格模式下绑定到undefined
function foo(){
console.log(this)
}
foo()//独立调用函数foo()
2.由对象调用,this指向调用的对象
function foo(){
console.log(this.a)
}
var obj={
a:2,
foo:foo
}
obj.foo()//2,被对象调用,foo()中的this指向对象obj
3.由new调用,指向新创建的对象
通过构造函数使用new操作符生成一个新对象(object)。这时this就指这个新对象
function Person(name){
this.name=name
this.init=function(){
console.log('Hi!'+this.name)
}
}
var Tom=new Person('Tom')
Tom.init()//Hi!Tom
4.由call(),apply(),bind()调用,绑定到指定的对象
- 用法:直接指定this的绑定对象是传入第一个参数
- bind():返回一个新函数,并且使函数内部的this为传入的第一个参数
- call()方法和 apply() 方法类似,只有一个区别,就是call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组。
var name='Jack'
function sayName(name){
console.log(this.name)
}
var Tom={
name:'Tom'
}
sayName()//Jack,独立调用函数sayName(),this指向全局对象window(非严格模式)
sayName.apply(Tom)//Tom,传入第一个参数为Tom,this指向对象Tom
sayName.call(Tom)//Tom,传入第一个参数为Tom,this指向对象Tom
sayName.bind(Tom)()//Tom,传入第一个参数为Tom,this指向对象Tom,bind()返回的是一个新函数