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 相关文章推荐
$.ajax json数据传递方法
Nov 19 Javascript
js获取提交的字符串的字节数
Feb 09 Javascript
js 颜色选择器(兼容firefox)
Mar 05 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
Nov 30 Javascript
JavaScript中的some()方法使用详解
Jun 09 Javascript
使用jspdf生成pdf报表
Jul 03 Javascript
javascript常见数据验证插件大全
Aug 03 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
Mar 25 Javascript
浅谈Node模块系统及其模式
Nov 17 Javascript
JavaScript继承的特性与实践应用深入详解
Dec 30 Javascript
vue实现页面滚动到底部刷新
Aug 16 Javascript
js实现弹窗效果
Aug 09 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
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
php异常处理捕获错误整理
2019/09/23 PHP
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
Node.js文件操作详解
2014/08/16 Javascript
js中实现多态采用和继承类似的方法
2014/08/22 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
Vue渲染过程浅析
2019/03/14 Javascript
Vue配置marked链接添加target="_blank"的方法
2019/07/19 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
jQuery 实现扁平式小清新导航
2020/07/07 jQuery
[35:26]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第三局
2016/02/26 DOTA
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
PyCharm更改字体和界面样式的方法步骤
2019/09/27 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
python 命名规范知识点汇总
2020/02/14 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
荷叶圆圆教学反思
2014/02/01 职场文书
司法助理专业自荐书
2014/06/13 职场文书
学校清明节活动总结
2014/07/04 职场文书
机关作风建设工作总结
2014/10/23 职场文书
二年级学生期末评语
2014/12/26 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书