学习打卡一 this的理解

146 阅读3分钟

首先理解为什么js会有this 

this 关键字是函数运行时自动生成的一个内部对象,只能在函数内部使用,总指向调用它的对象**。简单来说****,谁调用它,this就指向谁。**

this可以极其灵活的调用返回不同的结果,并且this提供了一种隐形的传递一个对象的引用。 要详细了解为啥会有this还是应该详细的了解一下内存结构。

如果不使用this,就需要显示传递上下文如下代码。

function person(context){
  return context.name.toUpperCase()
}

function speak(context){
  var regards = 'hello ' + person(context)
  console.log(regards)
}
var me = {
  name:"lilei"
}
var you = {
  name:"hanmeimei"
}person(you) //HANMEIMEI
speak(me) //hello LILEI

如果使用this就可以使用call,applay,bind方法改变this指向进行绑定。

对于this绑定的理解

1、全局环境下的this

在浏览器中:全局环境下使用this(不在外部函数内),this是指向window。

2、显示绑定

使用apply,call,bind进行this指向的绑定。

apply方法:

fn.apply( 作用对象, [arg1, arg2....])

apply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传入,且当第一个参数为null、undefined的时候,默认指向window(在浏览器中),使用apply方法改变this指向后原函数会立即执行。只改变作用对象。

call方法:
fn.call( 作用对象, arg1, arg2...)

call接受的第一个参数是this,后面可以跟若干个参数。当第一个参数为null或undefined的时候,表示指向window(在浏览器中), 并立即执行。只改变作用对象。

bind方法:

fn.bind(this, arg1, arg2...)

fn()

bind方法和call很相似,第一参数也是this的指向,后面传入的也是一个参数列表(但是这个参数列表可以分多次传入,call则必须一次性传入所有参数),但是它改变this指向后不会立即执行,而是返回一个永久改变this指向的函数。

3、隐式绑定

当函数在调用时,如果函数有所谓的“落脚点”,即**有上下文对象(即调用时.前面的对象)**时,隐式绑定规则会把函数中的 this 绑定到这个上下文对象。如果是箭头函数的话,那就不是指向当前上下文对象了,而是window。

function say() {
    console.log(this.name)
}
var name = "global"
var obj = {
    name: "inside",
    say: say
}
var alias = obj.say // 设置一个简写   (1)
alias() // 函数调用 输出"global"  (2)

4、new操作符绑定

通过 new 操作符调用构造函数时发生的 this 绑定。

但是要注意一个情况,该函数是否有返回值,返回值是否为对象(null特殊对象除外)

没有return object,this当前函数的实例对象

function Super(age){
  this.age = age
}

let instance = new Super('26')
console.log(instance.age) // 26

有return object,this指向的当前的object

function Super(age){
  this.age = age
  let obj = {a:'2'}
  return obj
}

let instance = new Super('26')
console.log(instance) // {a:'2'}
console.log(instance.age) // undefined

5、箭头函数情况

箭头函数的this是指向上一级作用域的this如果没有就一级一级往上找。

以上几种绑定的优先级

默认绑定 < 隐式绑定 < 显式绑定 < new 绑定

注意:bind只能被函数调用。而new 返回的是一个对象。即new 之后,函数的执行上下文就不可以被改变了,bind不行,显示绑定的三种形式都不行。所以new 绑定 的优先级最高。

参考www.cnblogs.com/buwuliao/p/…