实例讲解JavaScript中的this指向错误解决方法


Posted in Javascript onJune 13, 2016

看如下对象定义:

'use strict'
var jane = {
  name : ‘Jane',
  display : function(){
    retrun 'Person named ' + this.name;
  }
};

这样能正常调用

jane.display();

下面的调用会出错:

var func = jane.display;
func()
TypeError: Cannot read property 'name' of undefined

因为,this指向已经改变,正确的方式如下:

var func2 = jane.display.bind(jane);
func2()
'Penson named Jane'

所有函数都有其特殊的this变量,如下面的forEach

var jane = {
  name : 'Jane',
  friends: ['Tarzan', 'Cheeta'],
  sayHiToFriends: function(){
    'use strict';
    this.friends.forEach(function(friend) {
      // 'this' is undefined here
      console.log(this.name + ' says hi to '+ friend);
    });
  }
}

调用sayHiToFriends会产生一个错误:

jane.sayHiToFriends()
TypeError: Cannot read property 'name' of undefined

解决方案一:将this保存在不同的变量中

var jane = {
  name : 'Jane',
  friends: ['Tarzan', 'Cheeta'],
  sayHiToFriends: function(){
    'use strict';
    var that = this;
    this.friends.forEach(function(friend) {
      console.log(that.name + ' says hi to '+ friend);
    });
  }
}

解决方案二:利用forEach的第二个参数,它可以给this指定一个值

var jane = {
  name : 'Jane',
  friends: ['Tarzan', 'Cheeta'],
  sayHiToFriends: function(){
    'use strict';
    this.friends.forEach(function(friend) {
      console.log(this.name + ' says hi to '+ friend);
    }, this);
  }
}
Javascript 相关文章推荐
通过JAVAScript实现页面自适应
Jan 19 Javascript
javascript 短路法代码精简
Aug 20 Javascript
JQuery中clone方法复制节点
May 18 Javascript
百度地图api如何使用
Aug 03 Javascript
利用JS实现页面删除并重新排序功能
Dec 09 Javascript
JavaScript实现倒计时跳转页面功能【实用】
Dec 13 Javascript
vue使用axios实现文件上传进度的实时更新详解
Dec 20 Javascript
js循环map 获取所有的key和value的实现代码(json)
May 09 Javascript
浅谈vue引用静态资源需要注意的事项
Sep 28 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
Oct 09 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
Sep 18 Javascript
node.js如何操作MySQL数据库
Oct 29 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
Jun 13 #Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
Jun 13 #Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
Jun 13 #Javascript
浅谈JavaScript对象的创建方式
Jun 13 #Javascript
BootStrap智能表单实战系列(八)表单配置json详解
Jun 13 #Javascript
BootStrap智能表单实战系列(七)验证的支持
Jun 13 #Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
Jun 13 #Javascript
You might like
php准确获取文件MIME类型的方法
2015/06/17 PHP
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
理解JavaScript原型链
2016/10/25 Javascript
JavaScript 中的12种循环遍历方法【总结】
2018/05/31 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
Python线性方程组求解运算示例
2018/01/17 Python
python如何爬取个性签名
2018/06/19 Python
Win8下python3.5.1安装教程
2020/07/29 Python
Python中常用的内置方法
2019/01/28 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
python要安装在哪个盘
2020/06/15 Python
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
意大利领先的线上奢侈品销售电商:Eleonora Bonucci
2017/10/17 全球购物
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
全球最大运动品牌的男装、女装和童装官方库存商:A&A Sports
2021/01/17 全球购物
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
国外的一些J2EE面试题一
2012/10/13 面试题
外贸公司实习自我鉴定
2013/09/24 职场文书
外企财务年会演讲稿
2014/01/03 职场文书
接待员岗位责任制
2014/02/10 职场文书
人力资源部经理的岗位职责
2014/03/04 职场文书
绿色城市实施方案
2014/03/19 职场文书
雏鹰争章活动总结
2014/05/09 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
2015年度女工工作总结
2015/10/22 职场文书
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android