实例讲解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 相关文章推荐
读jQuery之十四 (触发事件核心方法)
Aug 23 Javascript
简单的js表单验证函数
Oct 28 Javascript
js 实现的可折叠留言板(附源码下载)
Jul 01 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
Feb 04 Javascript
Map.vue基于百度地图组件重构笔记分享
Apr 17 Javascript
详解Angular-Cli中引用第三方库
May 21 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
Jul 03 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
Aug 08 jQuery
微信小程序实现卡片层叠滑动效果
Jun 21 Javascript
微信小程序 网络通信实现详解
Jul 23 Javascript
js实现登录时记住密码的方法分析
Apr 05 Javascript
vue 使用原生组件上传图片的实例
Sep 08 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
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
php简单判断文本编码的方法
2015/07/30 PHP
php中序列化与反序列化详解
2017/02/13 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
jquery实现表格中点击相应行变色功能效果【实例代码】
2016/05/09 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
javascript常用的设计模式
2017/02/09 Javascript
走进AngularJs之过滤器(filter)详解
2017/02/17 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
Python模拟登录的多种方法(四种)
2018/06/01 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
Django DRF路由与扩展功能的实现
2020/06/03 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
简单的命令查看安装的python版本号
2020/08/28 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
CSS3 边框效果
2019/11/04 HTML / CSS
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
2014小学植树节活动总结
2014/03/10 职场文书
保险公司晨会主持词
2014/03/22 职场文书
会议室标语
2014/06/21 职场文书
售房协议书范本2014
2014/10/23 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python