首页 > 其他分享 >this的题目,我都是这样理解的,,除了箭头函数,this的指向就看它的直接调用者是谁!而箭头函数就找它外面第一个不是箭头函数的函数。

this的题目,我都是这样理解的,,除了箭头函数,this的指向就看它的直接调用者是谁!而箭头函数就找它外面第一个不是箭头函数的函数。

时间:2023-11-14 18:56:58浏览次数:31  
标签:函数 button 箭头 flag true change 调用者

假设document是HTML文档中的一个节点,点击该节点后会发生什么?

function test() {
  this.flag = false;
  this.change = () => {
    this.flag = true;
    console.log(button.flag);
  };
}
const button = new test();
document.addEventListener("click", button.change);

A
输出true

B
输出false

C
输出undefined

D
报错

正确答案:A

首先需要明白addEventListener的回调函数的函数上下文为触发事件的元素的引用,
如无意外则change方法改变的flag是节点上的flag,和button无关,
但是由于change是箭头函数,this与构造函数绑定在一起了,所以改变的flag是button的flag。

this的题目,我都是这样理解的,,除了箭头函数,this的指向就看它的直接调用者是谁!而箭头函数就找它外面第一个不是箭头函数的函数。

题目中调用button.change,所以去分析change(),而难点就在于 this.flag = true;的this是谁?
当看到change是一个箭头函数的this时,就什么也不要考虑,就去找外面第一个不是箭头函数的函数,
也就是说,他会把this绑定到text上,那this.flag = true;就意味着text()的实例中的flag会变成true,所以button.flag为true

()=>函数里面的this跟外面的函数指向同一个,也就是说当调用chang方法时,this.flag=true实际是将外面的this.flag=false的值改了

当test实例化为button时 会在实例中重新创建一个新的change箭头函数 而不是把change指向原型对象里面的change 实例里面的
change因为是箭头函数 所以this指向永远指向button实例

箭头函数没有this,如果使用了this,this指向父级作用域上下文。遇到箭头函数里使用this,你要看它的父级是不是函数,如果是,它就指向父级作用域的this。如果它的父级不是函数,就继续往上找,能找到函数,this就指向找到的函数的作用域,如果往上找父级找不到函数,就指向window.

 function test() {//构造函数中的this指向实例化对象。   
   
      this.flag = false;   
   
      this.change = () => {    //看这里,this.change也就是button.change,它是一个函数,是有作用域的。   
   
        this.flag = true;     //所以此处的this.flag相当于button.flag   即button.flag=true;   
   
        console.log(button.flag);   
   
      };   
   
    }   
   
    const button = new test();   
   
    document.addEventListener("click", button.change);   

标签:函数,button,箭头,flag,true,change,调用者
From: https://www.cnblogs.com/longmo666/p/17832287.html

相关文章

  • 类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以
    以下符合ES6写法的有:()AclassFoo{constructor(){returnObject.create(null);}}Foo()Bvarm=1;exportm;CexportvarfirstName=’Michael’;D在A模块中export{readFile}后,在B模块中importreadFilefrom‘A’可以获取到readFile正确答案:CA、Fun()把class当......
  • ES6的箭头函数,箭头函数不会创造块作用域,无法生成一个独立的环境,this指向上层的this
    varcolor='green';vartest4399={color:'blue',getColor:function(){varcolor="red";alert(this.color);}}vargetColor=test4399.getColor;getColor();test4399.getColor();以上JavaScrip......
  • 任何用let或const声明的属性不能够从它被声明的作用域中删除。任何使用 var 声明的属
    请问以下JS代码的输出结果是什么?leta=1;letobj={x:1}deletea;deleteobj.x;delete2;console.log(a);console.log(obj.x);console.log(2);A1、1、2B1、undefined、2C1、undefined、undefinedDundefined、undefined、undefined正确答案:B需要明确的......
  • 无涯教程-Dart - compareTo函数
    它返回一个整数,指示两个数字之间的关系。compareTo-语法Number.compareTo(x)x  - 代表一个数字。compareTo-返回值返回值-0  - 如果值相等。1  - 如果当前数字对象大于指定的数值。-1 - 如果当前数字对象小于指定的数字值。compareTo-......
  • 无涯教程-Dart - ceil函数
    此属性返回上限值,该上限值是大于或等于数字的最小整数。ceil-语法Number.ceil()ceil-示例voidmain(){vara=2.4;print("HiLearnfkTheceilingvalueof2.4=${a.ceil()}");}它将产生以下输出-。HiLearnfkTheceilingvalueof2.4=3参考链接http......
  • Python基础之map()函数
    map()函数会根据提供的对指定的可迭代对象的每个元素进行运算,并将返回运算结果的迭代器。先去将几个例子,这样比较通俗易懂。eg1:输入数据型a=map(int,input().split())输入:1213结果为:分析:map(int,input().split())将输入的值(input.split()的东西也叫做可迭代对象)通过空格......
  • YCOJ734 [ 20231114 NOIP 模拟赛 T3 ] 二次函数
    题意给定\(n\)个形如\(f(x)=(x-m)^2+k\)的二次函数。\(1,m,k\)表示加入一个顶点位\((m,k)\)的二次函数。\(2,x,t\)表示删除所有\(f(x)\let\)的二次函数。求每次操作结束后还剩余几个二次函数。Sol注意到题中二次系数为\(1\),这就意味着每一个函......
  • 无涯教程-Dart - isEven函数
    如果数字为偶数,则此属性返回true。isEven-语法num.isEvenisEven-示例voidmain(){intposNum=10;print(posNum.isEven);}它将产生以下输出-true参考链接https://www.learnfk.com/dart-programming/dart-programming-iseven-property.html......
  • Python函数参数传递中的可变参数
    Python函数参数传递中*args和**kargs在Python中,*args和**kwargs是用于处理可变数量的参数的特殊语法。*args:*args是一个元组(tuple),它允许你将不定数量的非关键字参数传递给函数。这意味着你可以在函数定义时指定一些参数,同时允许调用函数时传递不同数量的参数。通常用*......
  • 常用SQL函数
    随机RAND() 选择判断selectif例:selectif(consignment=0,'否','是') 条件选择casewhen...thenend例:casesupplierTypewhen1then'准目录供应商'when2then'sourcing供应商'end 字符串拼接:CONCAT拼接两个及两个以上字符串 GROUP_CONCAT用逗号分隔分组......