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 相关文章推荐
用脚本调用样式的几种方法
Dec 09 Javascript
JavaScript获取GridView中用户点击控件的行号,列号
Apr 14 Javascript
创建公共调用 jQuery Ajax 带返回值
Aug 01 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
Nov 23 Javascript
微信小程序 简单教程实例详解
Jan 13 Javascript
Bootstrap面板学习使用
Feb 09 Javascript
H5图片压缩与上传实例
Apr 21 Javascript
JS动态添加的div点击跳转到另一页面实现代码
Sep 30 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
Feb 28 Javascript
详解vue-router 初始化时做了什么
Jun 11 Javascript
ES6 对象的新功能与解构赋值介绍
Feb 05 Javascript
vue改变对象或数组时的刷新机制的方法总结
Apr 24 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
apache+php+mysql安装配置方法小结
2010/08/01 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
CI框架入门示例之数据库取数据完整实现方法
2014/11/05 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
2016/03/08 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
解决 FireFox 下[使用event很麻烦] 的问题.
2006/08/22 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
ES6正则的扩展实例详解
2017/04/25 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中的with...as用法介绍
2015/05/28 Python
Python做智能家居温湿度报警系统
2018/09/25 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
python 中xpath爬虫实例详解
2019/08/26 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
Python-openCV开运算实例
2020/07/05 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
如何设置Java的运行环境
2013/04/05 面试题
小学生演讲稿
2014/01/12 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
无传销社区工作方案
2014/05/13 职场文书
2014年政工师工作总结
2014/12/18 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers