• js中this的指向


     this是在运行时绑定的,跟函数定义的位置没有关系,跟函数调用的方式以及调用位置有关系。

    遵循四个规则:

    1.默认绑定

    2.隐式绑定

    3.显示绑定

    4.new绑定

    默认绑定

    当函数直接调用(独立调用)时,在浏览器中this指向window,在node环境下this指向空对象 {}

    隐式绑定

    通过上下文对象调用,这种需要对象内部必须有一个属性是对函数的引用,this绑定到这个上下文对象

    显式绑定

    通过call、apply、bind调用,this绑定到指定的对象

    new绑定

    通过new调用,this绑定到新创建的实例上

    绑定例外:

    规则总有例外,这里也是一样的

    1.被忽略的this

    当你把null,undefined作为this传给call,apply,bind,会被忽略,这里就会采用默认绑定

    1. var a = 'hello'
    2. function foo() {
    3. console.log(this.a, 'this')
    4. }
    5. foo.call(null) // hello

    2.箭头函数中的this

    1.    箭头函数没有自己的this:箭头函数中的this继承外层的普通函数中的this
    2.    箭头函数继承过来的this永远不会改变
    3.    call()、apply()、bind()等方法不能改变箭头函数中this的指向
    4.    箭头函数不能作为构造函数使用
    5.    箭头函数没有自己的arguments

    this的经典面试题:

    1. var name = 'window'
    2. var person1 = { // person1只是定义对象,并没有产生作用域
    3. name: 'person1',
    4. foo1: function () {
    5. console.log(this.name)
    6. },
    7. foo2: () => console.log(this.name), //上层作用域是全局
    8. foo3: function () {
    9. return function () {
    10. console.log(this.name)
    11. }
    12. },
    13. foo4: function () {
    14. return () => {
    15. console.log(this.name)
    16. }
    17. }
    18. }
    19. var person2 = { name: 'person2' }
    20. person1.foo1(); //person1
    21. person1.foo1.call(person2); // person2 (显示绑定的优先级大于隐式绑定)
    22. person1.foo2(); // window (箭头函数不绑定this,上层作用域是全局)
    23. person1.foo2.call(person2); //window (箭头函数不绑定this,上层作用域是全局)
    24. person1.foo3()(); // (独立的函数调用) //window
    25. person1.foo3.call(person2)(); // (独立的函数调用)window
    26. person1.foo3().call(person2); // person2
    27. person1.foo4()(); //person1(箭头函数不绑定this,上层作用域是person1)
    28. person1.foo4.call(person2)(); // person2 (箭头函数不绑定this,上层作用域是person2)
    29. person1.foo4().call(person2); // person1 (箭头函数不绑定this,上层作用域是person1)
    1. var name = 'window'
    2. function Person(name) {
    3. this.name = name
    4. this.foo1 = function () {
    5. console.log(this.name)
    6. },
    7. this.foo2 = () => console.log(this.name),
    8. this.foo3 = function () {
    9. return function () {
    10. console.log(this.name)
    11. }
    12. },
    13. this.foo4 = function () {
    14. return () => {
    15. console.log(this.name)
    16. }
    17. }
    18. }
    19. var person1 = new Person('person1')
    20. var person2 = new Person('person2')
    21. person1.foo1() // person1
    22. person1.foo1.call(person2) // person2 (显示绑定大于隐式绑定)
    23. person1.foo2() // person1 (上层作用域的this是person1)
    24. person1.foo2.call(person2) //person1 (箭头函数中不绑定this ,所以依旧中啊上层作用域)
    25. person1.foo3()() //window (独立函数调用)
    26. person1.foo3.call(person2)() // window (独立函数调用)
    27. person1.foo3().call(person2) // person2
    28. person1.foo4()() // person1
    29. person1.foo4.call(person2)() //person2
    30. person1.foo4().call(person2) // person1

  • 相关阅读:
    vs2019+qgis+qt学习总结
    华夏代驾_第一章_项目环境搭建_第一节
    动态规划 | 01背包问题例题 | 分割等和子集、石头相撞、目标和、1和0 | leecode刷题笔记
    算法学习笔记 4-1 二分算法(Binary-Search):致敬经典,超越经典 与 LeetCode真题(Java)
    软件测试——集成测试篇
    【2022】计算机视觉算法岗面试题目和复习知识点汇总
    leetcode 周赛 364
    中级-面试题目整理
    Spring Cloud Alibaba【实时监控数据、Sentinel为什么需要持久化 、Sentinel组件二次开发、认识本地事物 、事务的四大特性ACID】(九)
    虹科案例 | 2020款捷豹XE车倒车影像无法显示
  • 原文地址:https://blog.csdn.net/qq_33207292/article/details/126586250