实例讲解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 相关文章推荐
js 判断脚本加载完毕的代码
Jul 13 Javascript
封装了一个js图片轮换效果的函数
Sep 28 Javascript
jQuery中jqGrid分页实现代码
Nov 04 Javascript
JS函数实现动态添加CSS样式表文件
Dec 15 Javascript
JQuery $.each遍历JavaScript数组对象实例
Sep 01 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
Dec 10 Javascript
jQuery中outerHeight()方法用法实例
Jan 19 Javascript
vue中v-for循环给标签属性赋值的方法
Oct 18 Javascript
Vue项目引进ElementUI组件的方法
Nov 11 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
Dec 24 Javascript
Vue开发Html5微信公众号的步骤
Apr 11 Javascript
vuex实现购物车的增加减少移除
Jun 28 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
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
文本框的字数限制功能jquery插件
2009/11/24 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
document.getElementBy("id")与$("#id")有什么区别
2013/09/22 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
详解vue v-model
2020/08/31 Javascript
windows 下python+numpy安装实用教程
2017/12/23 Python
基于python requests库中的代理实例讲解
2018/05/07 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
python os.path模块常用方法实例详解
2018/09/16 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
Python 如何展开嵌套的序列
2020/08/01 Python
Python 实现集合Set的示例
2020/12/21 Python
纯HTML5+CSS3制作生日蛋糕代码
2016/11/16 HTML / CSS
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
10的分与合教学反思
2014/04/30 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
高中地理教学反思
2016/02/19 职场文书
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技