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 相关文章推荐
JScript中的undefined和"undefined"的区别
Mar 08 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
Jun 25 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
May 23 Javascript
jquery获取焦点和失去焦点事件代码
Apr 21 Javascript
jquery中实现时间戳与日期相互转换
Apr 12 Javascript
基于JS实现无缝滚动思路及代码分享
Jun 07 Javascript
js基于cookie记录来宾姓名的方法
Jul 19 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
Jan 09 Javascript
浅谈实现vue2.0响应式的基本思路
Feb 13 Javascript
详解Webpack loader 之 file-loader
Nov 07 Javascript
如何在Vue中抽离接口配置文件
Oct 31 Javascript
vue实现移动端返回顶部
Oct 12 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
简单易用的计数器(数据库)
2006/10/09 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
js 处理URL实用技巧
2010/11/23 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
2011/12/26 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
vue实现登陆登出的实现示例
2017/09/15 Javascript
Vue通过ref父子组件拿值方法
2018/09/12 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
基于Python和Scikit-Learn的机器学习探索
2017/10/16 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
numpy数组之存取文件的实现示例
2019/05/24 Python
python3实现单目标粒子群算法
2019/11/14 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
CSS3正方体旋转示例代码
2013/08/08 HTML / CSS
HTML5标签使用方法详解
2015/11/27 HTML / CSS
尤为Wconcept中国官网:韩国设计师品牌服饰
2019/01/10 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
园长自我鉴定
2013/10/06 职场文书
学生安全责任书
2014/04/15 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
节约用电标语
2014/06/17 职场文书
教师师德考核自我评价
2014/09/13 职场文书
2014年班干部工作总结
2014/11/25 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
反腐倡廉观后感
2015/06/08 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL