实例讲解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 AutoComplete自动完成 的使用方法实例
Mar 19 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
Jul 20 Javascript
jquery 循环显示div的示例代码
Oct 18 Javascript
js简单实现用户注册信息的校验代码
Nov 15 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
Apr 03 Javascript
js验证上传图片的方法
May 12 Javascript
即将发布的jQuery 3 有哪些新特性
Apr 14 Javascript
Bootstrap风格的WPF样式
Dec 07 Javascript
node安装--linux下的快速安装教程
Mar 21 Javascript
用jquery获取select标签中选中的option值及文本的示例
Jan 25 jQuery
详解vue-admin和后端(flask)分离结合的例子
Feb 12 Javascript
vue中eslintrc.js配置最详细介绍
Dec 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
日本十大惊悚动漫
2020/03/04 日漫
PHP新手上路(十三)
2006/10/09 PHP
php下实现农历日历的代码
2007/03/07 PHP
php 求质素(素数) 的实现代码
2011/04/12 PHP
for循环连续求和、九九乘法表代码
2012/02/20 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
JavaScript中的函数模式详解
2015/02/11 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
利用js的闭包原理做对象封装及调用方法
2017/04/07 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
解决Pycharm出现的部分快捷键无效问题
2018/10/22 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
浅谈Python反射 & 单例模式
2019/03/21 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
Python django框架 web端视频加密的实例详解
2020/11/20 Python
python实现企业微信定时发送文本消息的实例代码
2020/11/25 Python
DNA基因检测和分析:23andMe
2019/05/01 全球购物
JAVA招聘远程笔试题
2015/07/23 面试题
门卫人员岗位职责
2013/12/24 职场文书
党员干部公开承诺书
2014/03/26 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
七年级作文之下雨天
2019/12/23 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
Python Flask请求扩展与中间件相关知识总结
2021/06/11 Python