0%

在 Vue 组件中,通常我们希望 this 指向当前组件实例,以便可以访问组件的数据和方法。箭头函数,回调函数和 .bind 方法的使用会影响 this 的指向,因此在编写代码时需要特别注意。

示例 1:普通函数中的this

  • 正确用法:当方法通过对象调用时,this指向该对象。
    1
    2
    3
    4
    5
    6
    7
    const obj = {
    name: 'Alice',
    greet: function() {
    console.log(this.name); // 正确:this 指向 obj
    }
    };
    obj.greet(); // 输出: Alice
  • 错误用法:如果将方法赋值给一个变量并调用,this将指向全局对象。
    1
    2
    3
    4
    5
    6
    7
    8
    const obj = {
    name: 'Alice',
    greet: function() {
    console.log(this.name); // 错误:this 指向全局对象
    }
    };
    const greet = obj.greet;
    greet(); // 输出: undefined(在严格模式下会是 undefined)

示例 2:箭头函数中的this

  • 正确用法:箭头函数不创建自己的this,它捕获定义时的this值。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const obj = {
    name: 'Alice',
    greet: function() {
    const innerGreet = () => {
    console.log(this.name); // 正确:this 指向 obj
    };
    innerGreet();
    }
    };
    obj.greet(); // 输出: Alice
  • 错误用法:在箭头函数中,this的指向是定义时的上下文,而不是调用时的上下文。
    1
    2
    3
    4
    5
    6
    7
    const obj = {
    name: 'Alice',
    greet: () => {
    console.log(this.name); // 错误:this 指向全局对象
    }
    };
    obj.greet(); // 输出: undefined(在严格模式下会是 undefined)

示例 3:回调函数中的this

  • 正确用法:使用Function.prototype.bind方法显式地将this绑定到特定对象。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    const obj = {
    name: 'Alice',
    greet: function() {
    setTimeout(function() {
    console.log(this.name); // 正确:this 指向 obj
    }.bind(this), 1000);
    }
    };
    obj.greet(); // 输出: Alice
  • 错误用法:在回调函数中,this的指向可能会发生变化,通常不会指向预期的对象。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    const obj = {
    name: 'Alice',
    greet: function() {
    setTimeout(function() {
    console.log(this.name); // 错误:this 指向全局对象
    }, 1000);
    }
    };
    obj.greet(); // 输出: undefined(在严格模式下会是 undefined)

示例 4:使用变量保存this

  • 正确用法:在方法中使用一个变量保存this,然后在回调函数中使用该变量。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const obj = {
    name: 'Alice',
    greet: function() {
    const self = this;
    setTimeout(function() {
    console.log(self.name); // 正确:self 指向 obj
    }, 1000);
    }
    };
    obj.greet(); // 输出: Alice
  • 错误用法:直接在回调函数中使用this,可能会导致this指向全局对象。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    const obj = {
    name: 'Alice',
    greet: function() {
    setTimeout(function() {
    console.log(this.name); // 错误:this 指向全局对象
    }, 1000);
    }
    };
    obj.greet(); // 输出: undefined(在严格模式下会是 undefined)

示例 5:setup 函数中的 this

  • 在 Vue 3 的组合式 API 中,setup 函数是一个特殊的函数,它在组件实例创建之前被调用,因此在 setup 函数中不能使用 this 来访问组件实例的数据和方法。

总结

  • 使用箭头函数:箭头函数不会创建自己的this,它会捕获定义时的this值。
  • 使用Function.prototype.bind方法:显式地将this绑定到特定对象。
  • **使用变量保存this**:在方法中使用一个变量保存this,然后在回调函数中使用该变量。

理解这些用法和问题,可以帮助你在编写JavaScript代码时正确处理this的指向。

序言:呜呼,天不生春,通用技术如万古长夜

女同学面前我春风得意,男同学面前我重拳出击

传说在开天辟地之时,诞生了一位通用技术祖先,他的名字是春。与其他通用技术老师不同,别的老师教科书里记载的是通用技术,而春的教科书里记载的却是仙术

阅读全文 »

多年以后,面对理发店,沈将军将会回想起通用技术祖先被学生批斗的那个遥远的下午。

“你被解雇了,春!”,一个领头的学生站在高台上,她的声音在操场上回荡,引起一片附和的喧嚣。

就在春老师微微愣神的瞬间,一个黄毛学生趁机跃起,灵巧地夺过了他那顶鸭舌帽,在手中把玩着。春光滑的头顶瞬间暴露在阳光下,反射出一道刺眼的光芒。顿时,欢笑声四散开来,操场上充满了快活的气息。

阅读全文 »