基础一:箭头函数和普通函数的this区别

一、在前端 HTML 中,普通函数中的 this 指向 window 对象的情况通常发生在以下几种情况下:

1、全局作用域: 在全局作用域中定义的普通函数中,this 指向 window 对象:


2、事件处理函数: 当事件处理函数直接作为 HTML 元素的属性值时,this 指向触发事件的元素。但是如果将事件处理函数作为普通函数传递给 addEventListener 时,this 将指向 window

如果使用 addEventListener 来绑定事件处理函数,那么函数内部的 this 将指向全局作用域中的 window 对象,而不是触发事件的元素。例如:



在 HTML 元素中直接定义事件处理函数时,例如 onclick 属性中,this 指向的是触发事件的元素本身。例如:


在这个例子中,当按钮被点击时,onclick 中的代码会执行,并且 this 指向被点击的按钮元素。因此,this === window 将会是 false,因为 this 不是指向 window 对象。

3、未使用严格模式的匿名函数: 在未使用严格模式的匿名函数中,this 指向 window


4、构造函数中未使用 new 关键字: 当一个构造函数被调用但没有使用 new 关键字时,this 指向 window


5、定时器函数: 在定时器函数中,this 指向 window


二、如果有new

在 JavaScript 中,当使用 new 关键字调用构造函数时,this 指向新创建的对象实例。this 在这种情况下指向的是新创建的对象,而不再指向全局对象 window。这是 JavaScript 中构造函数的一种重要特性,它使得我们能够在构造函数内部操作新创建的对象实例。

function Person(name) {
    this.name = name;
    this.sayHello = function() {
        console.log('Hello, my name is ' + this.name);
    };
}

var person1 = new Person('John');
person1.sayHello(); // 输出:Hello, my name is John

在这个例子中,当使用 new 关键字创建 Person 对象实例时,this 指向新创建的对象 person1,并且在构造函数内部使用 this 来设置新对象实例的属性 name 和方法 sayHello

三、对vue组件中

在 Vue 组件中,通常情况下,无论是普通函数还是箭头函数,如果它们被用作 Vue 组件内的方法,它们的 this 都指向 Vue 组件的实例。但是有一些特殊情况需要注意:

生命周期钩子中的箭头函数: 在 Vue 的生命周期钩子中,如果使用箭头函数定义方法,this 不会指向组件实例,而是指向父级作用域。因此,不推荐在生命周期钩子中使用箭头函数。

export default {
  created: () => {
    // this 指向父级作用域,而不是组件实例
  }
}

Vue 实例方法中的箭头函数: 如果在 Vue 实例方法中使用箭头函数,this 也会指向父级作用域,而不是 Vue 实例。因此,在 Vue 组件中,如果需要访问 Vue 实例中的属性或方法,最好使用普通函数而不是箭头函数。

methods: {
  handleClick: () => {
    // this 指向父级作用域,而不是组件实例
  }
}

总的来说,在 Vue 组件中,普通函数和箭头函数大多数情况下都指向组件实例,但是需要注意特殊情况下的行为差异,尤其是在生命周期钩子和 Vue 实例方法中。

四、vue组件实例外层就是根组件vue

在箭头函数中,this 是在定义函数时所处的词法作用域中确定的,而不是在运行时确定的。因此,箭头函数中的 this 将会绑定到箭头函数定义时所处的父级作用域的 this。这通常意味着在 Vue 组件中,如果在生命周期钩子或 Vue 实例方法中使用箭头函数,它们的 this 将会指向定义它们的外部作用域,而不是组件实例。

具体来说,在 Vue 组件中,如果你在生命周期钩子或 Vue 实例方法中使用箭头函数,则箭头函数中的 this 将指向定义它们的父级作用域的 this。通常情况下,父级作用域是指包含 Vue 组件实例的外部作用域,例如 Vue 实例本身。

举例来说,如果你在 Vue 组件的 created 生命周期钩子中使用箭头函数,箭头函数中的 this 将指向 Vue 实例的 this,而不是指向组件实例:

export default {
  created: () => {
    // 在箭头函数中,this 指向定义箭头函数时所处的父级作用域的 this,通常是 Vue 实例的 this
    console.log(this); // 这里的 this 不是组件实例,而是父级作用域的 this,通常是 Vue 实例
  }
}

在 Vue 应用中,通常情况下 Vue 组件实例的外层作用域是 Vue 应用的根 Vue 实例,而不是特定的父级组件实例。这个根 Vue 实例通常被称为根组件或根 Vue 应用。

当你在 Vue 应用中使用组件时,每个组件都会有自己的作用域,但它们的外层作用域通常是根 Vue 实例。这意味着在组件中访问的父级作用域,通常是指的根 Vue 实例。

举个例子,如果你有一个名为 App 的根组件和一些子组件,那么子组件的外层作用域通常是 App 组件所属的根 Vue 实例。但这并不是绝对的,因为 Vue 提供了一些高级的组件通信方式,如 provideinject,它们可以让你在组件树中传递数据,这样的话在一些情况下,组件的外层作用域可以是其他组件。

总的来说,如果你的 Vue 应用是一个单一的根组件和一些子组件,那么子组件的外层作用域通常是根 Vue 实例。

准确来说,箭头函数中没有this,箭头函数的this指向取决于外层作用域中的this,外层作用域或函数的this指向谁,箭头函数中的this便指向谁。

五、对于组件中组件就是

在典型的 Vue 应用中,根组件的父级作用域通常是浏览器的全局作用域,也就是 window 对象。因为根组件是 Vue 应用的最顶层,它直接挂载在浏览器的 DOM 上。在这种情况下,根组件无法直接访问到 Vue 实例之外的作用域,因为它是 Vue 应用的入口点,没有外部作用域。

举例来说,如果你有一个名为 App 的根组件,它是直接挂载在 HTML 页面上的一个元素上,那么根组件 App 的父级作用域就是浏览器的全局作用域 window 对象。

你可能感兴趣的:(javascript)