美文网首页
javascript的this指向问题

javascript的this指向问题

作者: 洋洋袁 | 来源:发表于2019-03-21 11:28 被阅读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关键字是无意义的

    相关文章

      网友评论

          本文标题:javascript的this指向问题

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