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 相关文章推荐
同一个表单 根据要求递交到不同页面的实现方法小结
Aug 05 Javascript
JavaScript学习心得之概述
Jan 20 Javascript
对于jQuery性能的一些优化建议
Aug 13 Javascript
JS实现Select的option上下移动的方法
Mar 01 Javascript
js仿百度登录页实现拖动窗口效果
Mar 11 Javascript
jQuery判断checkbox选中状态
May 12 Javascript
原生js实现tab选项卡切换
Mar 23 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
Jan 20 Javascript
JavaScript 详解预编译原理
Jan 22 Javascript
详解jQuery设置内容和属性
Apr 11 jQuery
vue实现行列转换的一种方法
Aug 06 Javascript
JS访问对象两种方式区别解析
Aug 29 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版本实现代码
2012/09/15 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
2015/04/20 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
表单提交前触发函数返回true表单才会提交
2014/03/11 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
基python实现多线程网页爬虫
2015/09/06 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
对python 矩阵转置transpose的实例讲解
2018/04/17 Python
python进行两个表格对比的方法
2018/06/27 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
Python模块常用四种安装方式
2020/10/20 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
什么是lambda函数
2013/09/17 面试题
期中考试后的感想
2015/08/07 职场文书
教师学习心得体会范文
2016/01/21 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技