javascript中this的四种用法


Posted in Javascript onMay 11, 2015

this

在函数执行时,this 总是指向调用该函数的对象。要判断 this 的指向,其实就是判断 this 所在的函数属于谁。

在《javaScript语言精粹》这本书中,把 this 出现的场景分为四类,简单的说就是:

有对象就指向调用对象
没调用对象就指向全局对象
用new构造就指向新对象
通过 apply 或 call 或 bind 来改变 this 的所指。

1) 函数有所属对象时:指向所属对象

函数有所属对象时,通常通过 . 表达式调用,这时 this 自然指向所属对象。比如下面的例子:

var myObject = {value: 100};
myObject.getValue = function () {
 console.log(this.value); // 输出 100

 // 输出 { value: 100, getValue: [Function] },
 // 其实就是 myObject 对象本身
 console.log(this);

 return this.value;
};

console.log(myObject.getValue()); // => 100

getValue() 属于对象 myObject,并由 myOjbect 进行 . 调用,因此 this 指向对象 myObject。

2) 函数没有所属对象:指向全局对象

var myObject = {value: 100};
myObject.getValue = function () {
 var foo = function () {
  console.log(this.value) // => undefined
  console.log(this);// 输出全局对象 global
 };

 foo();

 return this.value;
};

console.log(myObject.getValue()); // => 100

在上述代码块中,foo 函数虽然定义在 getValue 的函数体内,但实际上它既不属于 getValue 也不属于 myObject。foo 并没有被绑定在任何对象上,所以当调用时,它的 this 指针指向了全局对象 global。

据说这是个设计错误。

3) 构造器中的 this:指向新对象

js 中,我们通过 new 关键词来调用构造函数,此时 this 会绑定在该新对象上。

var SomeClass = function(){
 this.value = 100;
}

var myCreate = new SomeClass();

console.log(myCreate.value); // 输出100

顺便说一句,在 js 中,构造函数、普通函数、对象方法、闭包,这四者没有明确界线。界线都在人的心中。

4) apply 和 call 调用以及 bind 绑定:指向绑定的对象

apply() 方法接受两个参数第一个是函数运行的作用域,另外一个是一个参数数组(arguments)。

call() 方法第一个参数的意义与 apply() 方法相同,只是其他的参数需要一个个列举出来。

简单来说,call 的方式更接近我们平时调用函数,而 apply 需要我们传递 Array 形式的数组给它。它们是可以互相转换的。

var myObject = {value: 100};

var foo = function(){
 console.log(this);
};

foo(); // 全局变量 global
foo.apply(myObject); // { value: 100 }
foo.call(myObject); // { value: 100 }

var newFoo = foo.bind(myObject);
newFoo(); // { value: 100 }

以所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
IE 下的只读 innerHTML
Aug 21 Javascript
Javascript实现div的toggle效果实例分析
Jun 09 Javascript
jquery设置表单元素为不可用的简单代码
Jul 04 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
Nov 16 Javascript
原生JS简单实现ajax的方法示例
Nov 29 Javascript
JS+html5制作简单音乐播放器
Sep 13 Javascript
vue2.0实现导航菜单切换效果
May 08 Javascript
vue 自定义全局方法,在组件里面的使用介绍
Feb 28 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
Jun 05 jQuery
jQuery 点击获取验证码按钮及倒计时功能
Sep 20 jQuery
JS判断两个数组或对象是否相同的方法示例
Feb 28 Javascript
js+css实现扇形导航效果
Aug 18 Javascript
JQuery插件jcarousellite的参数中文说明
May 11 #Javascript
javascript实现炫酷的拖动分页
May 11 #Javascript
JS+CSS实现的拖动分页效果实例
May 11 #Javascript
浅谈jQuery构造函数分析
May 11 #Javascript
在JavaScript中正确引用bind方法的应用
May 11 #Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
May 11 #Javascript
javascript实现验证IP地址等相关信息代码
May 10 #Javascript
You might like
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
php eval函数一句话木马代码
2015/05/21 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
PHP常用设计模式之委托设计模式
2016/02/13 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
Smarty日期时间操作方法示例
2016/11/15 PHP
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
jquery实现Ctrl+Enter提交表单的方法
2015/07/21 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
vue.js todolist实现代码
2017/10/29 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
Python 的描述符 descriptor详解
2016/02/27 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
python实现手机销售管理系统
2019/03/19 Python
python opencv摄像头的简单应用
2019/06/06 Python
python代码xml转txt实例
2020/03/10 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
大学生毕业自我鉴定范文
2014/02/03 职场文书
2014年迎新年联欢会活动策划方案
2014/02/26 职场文书
英语专业求职信
2014/07/08 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
代办出身证明书
2014/10/21 职场文书
贷款工作证明模板
2015/06/12 职场文书
学习十八大的感悟
2015/08/11 职场文书
python的html标准库
2022/04/29 Python
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android