实例讲解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数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
May 15 Javascript
js利用prototype调用Array的slice方法示例
Jun 09 Javascript
node.js中的console.assert方法使用说明
Dec 10 Javascript
js滚动条平滑移动示例代码
Mar 29 Javascript
JQuery点击事件回到页面顶部效果的实现代码
May 24 Javascript
jQuery实现的placeholder效果完整实例
Aug 02 Javascript
浅谈JavaScript中的this指针和引用知识
Aug 05 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
May 04 jQuery
使用Vue开发一个实时性时间转换指令
Jan 17 Javascript
Vue项目中如何引入icon图标
Mar 28 Javascript
Vue实现点击按钮复制文本内容的例子
Nov 09 Javascript
微信小程序实现锚点功能
Nov 20 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
最小化数据传输――在客户端存储数据
2006/10/09 PHP
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
php实现获取及设置用户访问页面语言类
2014/09/24 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
PHP实现15位身份证号转18位的方法分析
2019/10/16 PHP
jquery 学习笔记一
2010/04/07 Javascript
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
Javascript监视变量变化的方法
2015/06/09 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
vue-cli3 从搭建到优化的详细步骤
2019/01/20 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
python抽象基类用法实例分析
2015/06/04 Python
深入学习Python中的装饰器使用
2016/06/20 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
详解Python中for循环是如何工作的
2017/06/30 Python
Python开发的HTTP库requests详解
2017/08/29 Python
python不换行之end=与逗号的意思及用途
2017/11/21 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
商得四方公司面试题(gid+)
2014/04/30 面试题
应届生.NET方向面试题
2015/05/23 面试题
护理自荐信
2013/10/22 职场文书
2014中学教师节广播稿
2014/09/10 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2014年计生工作总结
2014/11/21 职场文书
乒乓球比赛通知
2015/04/27 职场文书
资金申请报告范文
2015/05/14 职场文书
捐款仪式主持词
2015/07/04 职场文书
Python import模块的缓存问题解决方案
2021/06/02 Python
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js