美文网首页饥人谷技术博客
javascript:this到底是什么?

javascript:this到底是什么?

作者: 吃一小勺 | 来源:发表于2017-07-01 10:32 被阅读0次

被误解的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()返回的是一个新函数

相关文章

网友评论

    本文标题:javascript:this到底是什么?

    本文链接:https://www.haomeiwen.com/subject/nvzvqxtx.html