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 正则表达式相关应介绍
Nov 27 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
Jun 27 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
Dec 14 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
Mar 13 Javascript
JavaScript实现显示函数调用堆栈的方法
Apr 21 Javascript
Javascript使用function创建类的两种方法(推荐)
Nov 19 Javascript
jQuery实现圣诞节礼物动画案例解析
Dec 25 Javascript
jQueryUI Sortable 应用Demo(分享)
Sep 07 jQuery
vue+swiper实现组件化开发的实例代码
Oct 26 Javascript
vue.js与element-ui实现菜单树形结构的解决方法
Apr 21 Javascript
详解基于 Node.js 的轻量级云函数功能实现
Jul 08 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
Sep 02 Javascript
微信小程序页面上下滚动效果
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中Session的概念
2006/10/09 PHP
xml在joomla表单中的应用详解分享
2012/07/19 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
Javascript typeof 用法
2008/12/28 Javascript
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
2019/08/01 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
python去掉字符串中重复字符的方法
2014/02/27 Python
Python 的 with 语句详解
2014/06/13 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
python的中异常处理机制
2018/08/30 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
python交易记录链的实现过程详解
2019/07/03 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
python em算法的实现
2020/10/03 Python
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
美国在线家装零售商:Build.com
2016/09/02 全球购物
SmartBuyGlasses美国官网:太阳眼镜和眼镜
2017/08/20 全球购物
优质的学校老师推荐信
2013/10/28 职场文书
室内拓展活动方案
2014/02/13 职场文书
先进工作者推荐材料
2014/12/23 职场文书
绵山导游词
2015/02/05 职场文书
公司备用金管理制度
2015/08/04 职场文书
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL