javascript中的this作用域详解


Posted in Javascript onJuly 15, 2019

Javascript中this的指向一直是困扰我很久的问题,在使用中出错的机率也非常大。在面向对象语言中,它代表了当前对象的一个引用,而在js中却经常让我觉得混乱,它不是固定不变的,而是随着它的执行环境的改变而改变。

在Javascript中this总是指向调用它所在方法的对象。因为this是在函数运行时,自动生成的一个内部对象,只能在函数内部使用。

下面我们分几种情况深入分析this的用法:

1.全局的函数调用

function globalTest() {
    this.name = "global this";
    console.log(this.name);
  }
  globalTest(); //global this

以上代码中,globalTest()是全局性的方法,属于全局性调用,因此this就代表全局对象window。为了充分证明this是window,对代码做如下更改:

var name = "global this";

  function globalTest() {
    console.log(this.name);
  }
  globalTest(); //global this

name作为一个全局变量,运行结果仍然是“global this”,说明this指向的是window。在方法体中我们尝试更改全局name,再次调用方法输出“rename global this”, 说明全局的name在方法内部被更改。代码如下:

var name = "global this";

  function globalTest() {
    this.name = "rename global this"
    console.log(this.name);
  }
  globalTest(); //rename global this

根据以上三段代码,我们得出结论:对于全局的方法调用,this指向的是全局对象window,即调用方法所在的对象。

2.对象方法的调用

如果函数作为对象的方法调用,this指向的是这个上级对象,即调用方法的对象。 在以下代码中,this指向的是obj对象。

function showName() {
    console.log(this.name);
  }
  var obj = {};
  obj.name = "ooo";
  obj.show = showName;
  obj.show(); //ooo

3.构造函数的调用

构造函数中的this指向新创建的对象本身。

function showName() {
    this.name = "showName function";
  }
  var obj = new showName();
  console.log(obj.name); //showName function

上述代码中,我们通过new关键字创建一个对象的实例,new关键字可以改变this的指向,将这个this指向对象obj。
我们再增加一个全局的name,用以证明this指向的不是global:

var name = "global name";

  function showName() {
    this.name = "showName function";
  }
  var obj = new showName();

  console.log(obj.name); //showName function
  console.log(name); //global name

在构造函数的内部,我们对this.name进行赋值,但并没有改变全局变量name。

4.apply/call调用时的this

apply和call都是为了改变函数体内部的this指向。 其具体的定义如下:

call方法:

语法:call(thisObj,Object)

定义:调用一个对象的一个方法,以另一个对象替换当前对象。

说明:

call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply方法:

语法:apply(thisObj,[argArray])

定义:应用某一对象的一个方法,用另一个对象替换当前对象。

说明:

如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。

如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

var value = "Global value";

  function FunA() {
    this.value = "AAA";
  }

  function FunB() {
    console.log(this.value);
  }
  FunB(); //Global value 因为是在全局中调用的FunB(),this.value指向全局的value
  FunB.call(window); //Global value,this指向window对象,因此this.value指向全局的value
  FunB.call(new FunA()); //AAA, this指向参数new FunA(),即FunA对象

  FunB.apply(window); //Global value
  FunB.apply(new FunA()); //AAA

在上述代码中,this的指向在call和apply中是一致的,只不过是调用参数的形式不一样。call是一个一个调用参数,而apply是调用一个数组。具体的会在以后的博文中单独阐述。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript类和继承 constructor属性
Mar 04 Javascript
jQuery的slideToggle方法实例
May 07 Javascript
JS逆序遍历实现代码
Dec 02 Javascript
js操作table元素实现表格行列新增、删除技巧总结
Nov 18 Javascript
JS中artdialog弹出框控件之提交表单思路详解
Apr 18 Javascript
浅谈json取值(对象和数组)
Jun 24 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
Sep 17 Javascript
JavaScript、C# URL编码、解码总结
Jan 21 Javascript
数组Array的一些方法(总结)
Feb 17 Javascript
vue单页开发父子组件传值思路详解
May 18 Javascript
在angularJs中进行数据遍历的2种方法
Oct 08 Javascript
jQuery实现日历效果
Sep 11 jQuery
微信小程序页面上下滚动效果
Nov 18 #Javascript
node.js实现上传文件功能
Jul 15 #Javascript
js canvas实现5张图片合成一张图片
Jul 15 #Javascript
js使用文件流下载csv文件的实现方法
Jul 15 #Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
Jul 15 #Javascript
微信小程序开发技巧汇总
Jul 15 #Javascript
微信小程序中如何计算距离某个节日还有多少天
Jul 15 #Javascript
You might like
一些PHP写的小东西
2006/12/06 PHP
php牛逼的面试题分享
2013/01/18 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
CMS中PHP判断系统是否已经安装的方法示例
2014/07/26 PHP
php查询whois信息的方法
2015/06/08 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
js中开关变量使用实例
2017/02/24 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
简单了解vue.js数组的常用操作
2019/06/17 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
python分析apache访问日志脚本分享
2015/02/26 Python
Python 自动刷博客浏览量实例代码
2017/06/14 Python
深入浅出分析Python装饰器用法
2017/07/28 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
python中删除某个元素的方法解析
2019/11/05 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
Clarks鞋美国官网:全球领军鞋履品牌
2017/05/13 全球购物
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
不打扫卫生检讨书
2014/02/12 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
教师工作总结范文2014
2014/11/10 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
公司致全体员工的感谢信
2019/06/24 职场文书
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers