javascript的this指向问题

2019-03-21  本文已影响0人  洋洋袁

1. 函数名直接调用

例如getName();这样的调用无论实在那个地方,无论函数定义在全局或者某个函数体内部,函数的this指向window

function a () {

console.log(this)// window

  b();

  function b () {

console.log(this)// window

  }

}

a()

2. 对象的方法调用 obj.getName

对象的方法调用this指向对象本身,如下

let name ='zhangsan'

let obj = {

name:'lisi',

  getName(){

console.log(this.name)// lisi

  }

}

obj.getName();

3. 构造函数内部

function Teacher () {

this.name ='prototype';

}

Teacher.prototype.getName =function () {

console.log(this.name) // liming

}

let t =new Teacher();

t.name ='liming';

t.getName()

去掉t.name = 'liming',结果为prototype

通过new函数this指向new出的当前对象,如果直接调用和普通函数一样,指向window;

同样的,构造函数的原型对象指向当前对象

4.  call,apply和bind改变this指向

let obj = {

name:'lisi',

  getNmae() {

return this.name;

  }

}

let obj2 = {name:'zhangsan'};

console.log(obj.getNmae.call(obj2)) // zhangsan

5. 箭头函数

箭头函数的this指向父级作用域.

var name ='张三' // 如果let,那么打印的就是空,因为let声明的变量不会挂载到window上去

let obj = {

name:'李四',

  getNmae() {

printName()

}

}

let printName = () => {

console.log(this.name)

}

printName();

obj.getNmae();

6. export中的this

a文件:

function test () {

console.log(this)

}

export {test}

b文件中import,然后调用

import {test}from './test.js'

test(); // 打印的是undefined

原因:

1. 代码是在模块作用域之中运行,而不是在全局作用域中运行。模块内部的顶层变量是外部不可见的。

2. 在模块之中,顶层的this关键字返回undefined,而不是指向window。也就是说,在模块顶层使用this关键字是无意义的

上一篇 下一篇

猜你喜欢

热点阅读