实例讲解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中的Window窗口对象
Jan 16 Javascript
JQuery 确定css方框模型(盒模型Box Model)
Jan 22 Javascript
理解Javascript_13_执行模型详解
Oct 20 Javascript
JQuery select控件的相关操作实现代码
Sep 14 Javascript
JS弹出层单纯的绝对定位居中示例代码
Feb 18 Javascript
详解JavaScript基于面向对象之创建对象(1)
Dec 10 Javascript
jQuery自定义数值抽奖活动代码
Jun 11 Javascript
解决拦截器对ajax请求的拦截实例详解
Dec 21 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
Dec 29 Javascript
微信小程序实现笑脸评分功能
Nov 03 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
May 28 Javascript
layui动态渲染生成select的option值方法
Sep 23 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 飞信好友免费短信API接口开源版
2010/07/22 PHP
php下统计用户在线时间的一种尝试
2010/08/26 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
Netbeans 8.2将支持PHP7 更精彩
2016/06/13 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
JavaScript使用cookie
2007/02/02 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
jQuery简单入门示例之用户校验demo示例
2016/07/09 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
使用npm安装最新版本nodejs
2018/01/18 NodeJs
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
Python md5与sha1加密算法用法分析
2017/07/14 Python
利用Python如何生成hash值示例详解
2017/12/20 Python
Python装饰器用法实例总结
2018/02/07 Python
用python绘制樱花树
2020/10/09 Python
django跳转页面传参的实现
2020/09/17 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
中学教师实习自我鉴定
2013/09/28 职场文书
数学专业推荐信范文
2013/11/21 职场文书
公务员职业生涯规划书范文  
2014/01/19 职场文书
鸿星尔克广告词
2014/03/21 职场文书
入党积极分子评语
2014/05/04 职场文书
2015年外联部工作总结
2015/04/03 职场文书
辩护词格式
2015/05/22 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android