实例讲解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 相关文章推荐
一个cssQuery对象 javascript脚本实现代码
Jul 21 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
May 24 Javascript
js实现广告漂浮效果的小例子
Jul 02 Javascript
浏览器的JavaScript引擎的识别方法
Oct 20 Javascript
node.js中的console用法总结
Dec 15 Javascript
javascript中scrollTop详解
Apr 13 Javascript
AngularJS 单元测试(二)详解
Sep 21 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
Feb 09 Javascript
浅谈vue项目如何打包扔向服务器
May 08 Javascript
vue路由前进后退动画效果的实现代码
Dec 10 Javascript
js实现验证码干扰(静态)
Feb 22 Javascript
js前端设计模式优化50%表单校验代码示例
Jun 21 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
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
php实现图片局部打马赛克的方法
2015/02/11 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
jquery插件tooltipv顶部淡入淡出效果使用示例
2013/12/05 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
2015/09/02 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
[01:10]DOTA2 Supermajor:英雄,由我们见证
2018/05/14 DOTA
python数据结构之列表和元组的详解
2017/09/23 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
Python 删除整个文本中的空格,并实现按行显示
2018/07/24 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
Python FFT合成波形的实例
2019/12/04 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
.NET方向面试题
2014/11/20 面试题
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
工商管理本科毕业生求职信范文
2013/10/05 职场文书
小型女装店的创业计划书
2014/01/09 职场文书
证婚人搞笑证婚词
2014/01/10 职场文书
高三生物教学反思
2014/01/25 职场文书
学习雷锋精神心得体会范文
2014/03/12 职场文书
体育课课后反思
2014/04/24 职场文书
付款证明格式范文
2015/06/19 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python