JS回调函数中的this指向(详细)
首先先说下正常的 this 指向问题
什么是 this:自动引用正在调用当前方法的.前的对象。
this指向的三种情况
1. obj.fun() fun 中的 this->obj ,自动指向.前的对象
2. new Fun() Fun 中的 this->正在创建的新对象,new 改变了函数内部的 this 指向,导致 this 指向实例化 new 的对象
3. fun() 和匿名函数自调 this 默认->window,函数内部的 this,this 默认是指向 window 的
再说回调函数中的 this 指向问题,我们先来看一个例子
<script>
var Bob={
sname:"鲍勃",
friends:["Jack","Rose","Tom","Jerry"],
intr(){
this.friends.forEach(function(ele){
console.log(this.sname+"认识"+ele);
});
}
}
Bob.intr();
</script>
看结果:
undefined认识Jack
undefined认识Rose
undefined认识Tom
undefined认识Jerry
回调函数中的this默认是指向window的,因为本质上是在函数内callback,并没有.前的对象调用
如何解决:
使用箭头函数
1<script>
2 var Bob={
3 sname:"鲍勃",
4 friends:["Jack","Rose","Tom","Jerry"],
5 intr(){
6 this.friends.forEach(ele=>{
7 console.log(this.sname+"认识"+ele);
8 });
9 }
10 }
11 Bob.intr();
12 </script>
结果是:
鲍勃认识Jack
鲍勃认识Rose
鲍勃认识Tom
鲍勃认识Jerry
可以看出箭头函数内的this自动指向了回调函数外层的 this 。
箭头函数中的 this:
函数体内的 this 对象,就是定义时所在的对象,而不是使用时所在的对象。
this 指向的固定化,并不是因为箭头函数内部有绑定 this 的机制,实际原因是箭头函数根本没有自己的 this,导致内部的 this 就是外层代码块的 this。正是因为它没有 this,所以也就不能用作构造函数。
也可使用bind永久绑定this
var Bob={
sname:"鲍勃",
friends:["Jack","Rose","Tom","Jerry"],
intr(){
this.friends.forEach(function(friend){
console.log(this.sname+"认识"+friend);
}.bind(this));
}
}
Bob.intr();
JS回调函数中的this指向(详细)的更多相关文章
- Javascript回调函数中的this指向问题
使用js中的定时器(setInterval,setTimeout),很容易会遇到this指向的问题. 直接上例子: 1 var name = 'my name is window'; 2 var ob ...
- 理解 JS 回调函数中的 this
任何变量或对象都有其赖以生存的上下文.如果简单地将对象理解为一段代码,那么对象处在不同的上下文,这段代码也会执行出不同的结果. 例如,我们定义一个函数 getUrl 和一个对象 pseudoWindo ...
- => 应用在js回调函数中
=> 可以简化以前的回调函数的调用,具体来说: 今后,几乎所有的回调函数都可用箭头函数简化 比如: 1. 所有回调函数都可: 去function改=> 2. 如果函数体只有一句话: 可省略 ...
- JS高级 — 函数中的this指向问题
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- 使用匿名函数在回调函数中正确访问JS循环变量
有时候, 需要以不同的参数调用某个URL,并且在回调函数中仍然可以访问正在使用的参数, 这时候, 需要使用闭包保存当前参数, 否则, 当回调函数执行时, 之前的参数很可能早已被修改为最后一个参数了. ...
- js闭包中的this(匿名函数中的this指向的是windows)
js闭包中的this(匿名函数中的this指向的是windows) 一.总结 1.普通函数中的this指向的是对象,匿名函数中的this指向的是windows,和全局变量一样 2.让匿名函数中的thi ...
- JS的一些总结(函数声明和函数表达式的区别,函数中的this指向的问题,函数不同的调用方式,函数也是对象,数组中的函数调用)
一.函数声明和函数表达式的区别: 函数声明放在if——else语句中,在IE8中会出现问题 函数表达式则不会 <script> if(true){ function f1(){ conso ...
- 改变函数中的 this 指向——神奇的call,apply和bind及其应用
在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...
- OpenCV-Python setMouseCallback回调函数中图像变量img的传递方法解析
☞ ░ 前往老猿Python博文目录 ░ 一.使用全局变量进行变量传递 OpenCV-Python中可以使用setMouseCallback来设置鼠标事件的回调函数,我们来看个样例. 1.1.案例1代 ...
随机推荐
- 修改hostname
修改hostname步骤 1. 修改/etc/sysconfig/network中的hostname选项 2. 在/etc/hosts中添加hostname对应的ip地址 3.执行命令:hostnam ...
- django中如何实现分页功能
1.在html页面中导入js文件和css文件 <link rel="stylesheet" href="../../../static/css/jquery.pag ...
- linux下如何查看某软件是否已安装
因为linux安装软件的方式比较多,所以没有一个通用的办法能查到某些软件是否安装了.总结起来就是这样几类: 1.rpm包安装的,可以用rpm -qa看到,如果要查找某软件包是否安装,用 rpm - ...
- NetCore持续踩坑
坑1: vs2017 安装 .netcore2.2.2后,新建项目编译报错:.NET SDK 不支持降.NET Core2.2 设置为目标. 我以为是.netcore的sdk版本有误,于是我查看.ne ...
- logback 按时间和大小生成日志不生效的问题
服务器要记录所有的日志,这些日志输入到一个文件中太大了,就需要按大小和时间还分割,比如每小时产生一个文件或当文件大小大于200MB的时候生成一个文件. 第一版这样版本,但是服务器启动之后没有生成日志文 ...
- 25 range打印100到0的连续整数
使用range打印100,99,98,...0for i in range(100,-1,-1): print(i)
- 为fastdfs文件服务器新增一个storage
一.前言: 前期,已经搭建好了一套fastdfs文件服务器,一个tracker和一个storage,且部署在同一台服务器上,已经正式投入运行快半年了,1T的空间现在只剩下100G容量了,现在需要扩容, ...
- SVN版本服务器搭建(服务端+客户端)
原文地址:http://www.cnblogs.com/warrior1988/p/5359084.html 环境:Win7 32 bit SVN简介:程序员在编写程序的过程中,每个程序员都会生成很多 ...
- linux 网络设置
centos7 ifcfg-ens33静态ip地址配置 vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=EthernetPROXY_METHO ...
- B/S架构图解