实例讲解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 相关文章推荐
this[] 指的是什么内容 讨论
Mar 24 Javascript
jQuery.getScript加载同域JS的代码
Feb 13 Javascript
jQuery中的val()示例应用
Feb 26 Javascript
javascript定义变量时有var和没有var的区别探讨
Jul 21 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
Apr 20 Javascript
javascript消除window.close()的提示窗口
May 20 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
Oct 13 Javascript
移动端web滚动分页的实现方法
May 05 Javascript
在vue中多次调用同一个定义全局变量的实例
Sep 25 Javascript
JavaScript实现简单随机点名器
Nov 21 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
Dec 15 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
Oct 15 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下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
JS设置cookie、读取cookie、删除cookie
2015/04/17 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
javascript中传统事件与现代事件
2015/06/23 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
TypeScript入门-基本数据类型
2017/03/28 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
angular中子控制器向父控制器传值的实例
2018/10/08 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
vue+element实现图片上传及裁剪功能
2020/06/29 Javascript
JavaScript实现世界各地时间显示
2020/09/07 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
Python中几种操作字符串的方法的介绍
2015/04/09 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
什么是python的id函数
2020/06/11 Python
python进行二次方程式计算的实例讲解
2020/12/06 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
应聘收银员个人的求职信
2013/11/30 职场文书
校园网站的创业计划书范文
2013/12/30 职场文书
矫正人员思想汇报
2014/01/08 职场文书
村道德模范事迹材料
2014/08/28 职场文书
工会文体活动总结
2015/05/07 职场文书
关于python中模块和重载的问题
2021/11/02 Python
Redis实现分布式锁的五种方法详解
2022/06/14 Redis