JavaScript中this的用法及this在不同应用场景的作用解析


Posted in Javascript onApril 13, 2017

由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。

JavaScript 中函数的调用有以下几种方式:作为函数调用,作为对象方法调用,作为构造函数调用,和使用 apply 或 call 调用。下面我们将按照调用方式的不同,分别讨论 this 的含义。

情况一:纯粹的函数调用

这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。

1、函数也可以直接被调用,此时 this 绑定到全局对象。

function makeNoSense(x) { 
  this.x = x; 
} 
makeNoSense(5); 
console.log(x);// x 已经成为一个值为 5 的全局变量
function test(){
this.x = 1;

alert(this.x);
}
test(); // 1

情况二:作为对象方法的调用

函数还可以作为某个对象的方法调用,这时this指代对象内部属性被调用。

var myObject = {
value :0,

increment:function (inc){


this.value += typeof inc ==='number' ? inc:1;

}
};
myObject.increment();
console.log(myObject.value); //1
myObject.increment(2);
console.log(myObject.value); //3

情况三 :作为构造函数调用

javaScript 支持面向对象式编程,与主流的面向对象式编程语言不同,JavaScript 并没有类(class)的概念,而是使用基于原型(prototype)的继承方式。

相应的,JavaScript 中的构造函数也很特殊,如果不使用 new 调用,则和普通函数一样。作为又一项约定俗成的准则,构造函数以大写字母开头,提醒调用者使用正确的方式调用。如果调用正确,this 绑定到新创建的对象上。

所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。

function Point(x, y){ 
  this.x = x; 
  this.y = y; 
 }
var p1 = new Point(3,2);
console.log(p1.x+","+p1.y);//3,2

为了表明这时this不是全局对象,我对代码做一些改变:

var x = 4;
function Point(x, y){ 
  this.x = x; 
  this.y = y; 
 }
var p1 = new Point(3,2);
console.log(p1.x+","+p1.y);//3,2

情况四: apply或call调用

让我们再一次重申,在 JavaScript 中函数也是对象,对象则有方法,apply 和 call 就是函数对象的方法。这两个方法异常强大,他们允许切换函数执行的上下文环境(context),即 this 绑定的对象。很多 JavaScript 中的技巧以及类库都用到了该方法。让我们看一个具体的例子:

function Point(x, y){ 
  this.x = x; 
  this.y = y; 
  this.moveTo = function(x, y){ 
    this.x = x; 
    this.y = y; 
    console.log(this.x+","+this.y);
  } 
} 
var p1 = new Point(0, 0); 
var p2 = {x: 0, y: 0}; 
p1.moveTo(1, 1); //1,1
p1.moveTo.apply(p2, [10, 10]);//10,10

在上面的例子中,我们使用构造函数生成了一个对象 p1,该对象同时具有 moveTo 方法;使用对象字面量创建了另一个对象 p2,我们看到使用 apply 可以将 p1 的方法应用到 p2 上,这时候 this 也被绑定到对象 p2 上。另一个方法 call 也具备同样功能,不同的是最后的参数不是作为一个数组统一传入,而是分开传入的。本文通过对JavaScript中经常容易混淆的this在四中应用场景中的使用方法进行了讲解,希望对您有所帮助,喜欢的话,请推荐一下哦。

以上所述是小编给大家介绍的JavaScript中this的用法及this在不同应用场景的作用解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
在jquery中的ajax方法怎样通过JSONP进行远程调用
Apr 04 Javascript
JS简单模拟触发按钮点击功能的方法
Nov 30 Javascript
JavaScript文档碎片操作实例分析
Dec 12 Javascript
jQuery插件uploadify实现ajax效果的图片上传
Jun 18 Javascript
JavaScript中const、var和let区别浅析
Oct 11 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
Aug 30 Javascript
vue2.0在table中实现全选和反选的示例代码
Nov 04 Javascript
浅谈webpack编译vue项目生成的代码探索
Dec 11 Javascript
vue使用自定义icon图标的方法
May 14 Javascript
vue页面加载时的进度条功能(实例代码)
Jan 13 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
Oct 12 Javascript
详细介绍Next.js脚手架完整搭建封装
Apr 26 Javascript
vue如何引用其他组件(css和js)
Apr 13 #Javascript
JavaScript数据结构之二叉树的遍历算法示例
Apr 13 #Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
Apr 13 #jQuery
vue组件如何被其他项目引用
Apr 13 #Javascript
微信小程序开发之数据存储 参数传递 数据缓存
Apr 13 #Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
Apr 13 #jQuery
老生常谈javascript中逻辑运算符&&和||的返回值问题
Apr 13 #Javascript
You might like
屏蔽浏览器缓存另类方法
2006/10/09 PHP
浅析PHP水印技术
2007/02/14 PHP
php文档更新介绍
2011/07/22 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
jquery操作select大全
2014/04/25 Javascript
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
vue.js todolist实现代码
2017/10/29 Javascript
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
2018/01/30 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
iview在vue-cli3如何按需加载的方法
2018/10/31 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
[03:11]不朽宝藏三外观展示
2020/09/18 DOTA
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
Python中如何添加自定义模块
2020/06/09 Python
Python自带的IDE在哪里
2020/07/01 Python
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
一套中级Java程序员笔试题
2015/01/14 面试题
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
python 离散点图画法的实现
2022/04/01 Python
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python