实例讲解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 学习之旅 (1)
Feb 05 Javascript
javascript学习笔记(六) Date 日期类型
Jun 19 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
Dec 28 Javascript
node.js中的path.normalize方法使用说明
Dec 08 Javascript
浅析js中substring和substr的方法
Nov 09 Javascript
使用bootstrap3开发响应式网站
May 12 Javascript
返回函数的JavaScript函数
Jun 14 Javascript
详解自定义ajax支持跨域组件封装
Feb 08 Javascript
vue cli升级webapck4总结
Apr 04 Javascript
three.js实现圆柱体
Dec 30 Javascript
javascript实现超好看的3D烟花特效
Jan 01 Javascript
vue 二维码长按保存和复制内容操作
Sep 22 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
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
js每隔5分钟执行一次ajax请求的实现方法
2013/11/27 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
Python里disconnect UDP套接字的方法
2015/04/23 Python
python获取指定时间差的时间实例详解
2017/04/11 Python
Python简单的制作图片验证码实例
2017/05/31 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
django中间键重定向实例方法
2019/11/10 Python
python线程信号量semaphore使用解析
2019/11/30 Python
Python中实现输入一个整数的案例
2020/05/03 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
给导游的表扬信
2014/01/10 职场文书
小学数学课后反思
2014/04/23 职场文书
工商管理本科生求职信
2014/07/13 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
小学中等生评语
2014/12/29 职场文书
党员年度个人总结
2015/02/14 职场文书
2015年小班保育员工作总结
2015/05/27 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
pytorch中的numel函数用法说明
2021/05/13 Python