首页 > 其他分享 >1、forEach用法及this的一点小引申

1、forEach用法及this的一点小引申

时间:2023-05-11 20:00:14浏览次数:50  
标签:function 函数 sum 引申 用法 forEach thisArg element

# forEach用法

// 回调函数
forEach(callbackFn)
forEach(callbackFn, thisArg)

// 箭头函数[无thisArg的用法]
forEach((element) => { /* … */ }) 元素
forEach((element, index) => { /* … */ }) +索引

forEach((element, index, array) => { /* … */ }) +当前数组

forEach((element, index, array) => { /* … */ },thisArg) 这里的thisArg不会作为函数中的this,函数中的this指向上一级的对象

 

// 内联回调函数
forEach(function(element) { /* … */ })
forEach(function(element, index) { /* … */ })
forEach(function(element, index, array){ /* … */ })
forEach(function(element, index, array) { /* … */ }, thisArg)

      注意thisArg这个参数:

(1)thisArg在箭头函数中无效,this指向函数上一级的对象。很多人说指向window,其实是不准确的。如下例(1)(2)

(2)在非箭头函数中,如果 thisArg 参数有值,则每次 callback 函数被调用时,this 都会指向 thisArg 参数。如果省略了 thisArg 参数,或者其值为 null 或 undefined,this 则直接指向window,不传导。如例子(3)

 例子(1)

let a ={
   sum:function(){
      [3].forEach(()=>{console.log(this)})
   }
};
a.sum();//输出a对象

 

 例子(2)

let a ={
   sum:()=>{
      [3].forEach(()=>{console.log(this)})
   }
};
a.sum();//输出window对象。这是由于上一级也是箭头函数,所以继续向上传导

例子(3)

let a ={
   sum:function(){//这里如果是箭头函数,也是输出window
      [3].forEach(function(){console.log(this)})
   }
};
a.sum();//输出window

如果要在例子(3)中,让函数里可以使用this,那么就可以使用bind(this)。这样就可以得到例(4)(5)

例子(4)

let a ={
   sum:function(){
      [3].forEach(function(){console.log(this)}.bind(this))
   }
};
a.sum();//输出对象a

 

例子(5)

let a ={
   sum:()=>{
      [3].forEach(function(){console.log(this)}.bind(this))
   }
};
a.sum();//输出对象window,因为箭头函数不捕获this,继续传导。

 

 意外小总结: 总结箭头函数不捕获this,继续传导。function(){}形式的函数,捕获this。//这里“捕获”这个词是笔者自己的理解,非专业术语

 

翻译

搜索

复制

标签:function,函数,sum,引申,用法,forEach,thisArg,element
From: https://www.cnblogs.com/dongfangchun/p/17392072.html

相关文章

  • C# Action和Func的用法详解
    委托是一个类,定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。  把一个参数类型返回值相同方法名不同的方法当变量的方法叫委托。  为了实现程序的六大设计中的开闭原则:解耦,对修改关闭,对扩展开放。逻辑分离。  直接调用函数和使用委托调用函数......
  • c++模版多参数的递归用法--自定义log
    #include<iostream>#include<sstream>#include<string>#include<tuple>#include<type_traits>template<typenameT>voidprint_impl(std::ostringstream&os,constchar*format,T&&arg){while(*form......
  • Qt QTimer::singleShot问题及用法
    问题描述问题描述:QTimer::singleShot定时器事件超时,如果此时类内对象已经被回收,定时器事件调用已经释放的类内资源时会引起崩溃1voidfunc()2{3QTimer::singleShot(50,[=](){4this->continueNodeTask();5});6}78/*9如果singleShot事......
  • Qt QTimer::singleShot用法
    [static]voidQTimer::singleShot(intmsec,constQObject*receiver,constchar*member)这个静态函数在一个给定时间间隔msec(毫秒)之后调用一个槽。用法1:假设类A有个槽函数function(){}我们要在10s之后执行它就可以: QTimer::singleShot(10*1000,this,&A::func......
  • JS中some和every的区别和用法
    some和every是数组中迭代的方法相同点:some和every都有三个参数,即item→当前项,index→当前的索引值,array→数组本身;都可以遍历数组不同点:some相当于逻辑关系中的或,只要有一个参数满足条件,则中断遍历,返回true,如果遍历完所有参数,没有找到符合的项,即返回false;every相当于关系中的且,......
  • ibatis-dynamic的用法
    去除第一个prepend="and"中的字符(这里为and),从而可以帮助你实现一些很实用的功能。具体情况如下:1.使用dynamic1.1xmlselect*fromPerson表    <dynamicprepend="where"><isNotNullproperty="name"prepend="and">......
  • xargs命令用法
    参考自阮一峰xargs命令教程xargs命令教程-阮一峰的网络日志(ruanyifeng.com)一、为什么要用xargs呢。unix命令都有参数,有些命令可以接受标准输入(stdin)作为参数[root@xian-01]#cat/etc/passwd|greproot[root@xian-01]#grep--help|grepstandSearchforPATTERN......
  • 第五章学习 循环结构,分支结构,break,continue,return的用法,接收用户数据的fmt.scanl
       packagemainimport"fmt"funcmain(){//实现功能,键盘录入学生age,name,grage,是否为vipvarageintfmt.Println("请录入年龄")//传入age地址的目的:scanln函数中,对地址的值进行改变,实际上是对age值进行改变fmt.Scanln(&age)varname......
  • python 中 re.match 和 re.search用法
     001、re.match>>>re.match("ab","abcdefgab")##在字符串abcdefgab中查找字符串ab,返回索引<re.Matchobject;span=(0,2),match='ab'>>>>re.match("xy","abcdefgab")##如果查找字符串不存在,返回none&g......
  • python中strip和split的用法
    strip()用法str.strip()作用是删除字符串(str)的头和尾的空格,以及位于头尾的\n,\t等。不抓取字符串中间的空格,只抓头尾示例1:str="ABCABCABC\n"print(str)#输出原始字符串str,'\n'会空格一行print(str.strip())#删除头部空格,以及尾部的\nprint(str.ls......