通俗易懂------this指向

因为JavaScript 中this 是在运行期进行绑定的,因此JavaScript 中this 关键字具备多重含义。

具体在实际应用中,this的指向大致可以分为下面4种。

  1. 作为对象的方法调用   obj.a()
  2. 作为普通函数调用    a()
  3. 构造函数调用        var b = new a(); 
  4. function.prototype.call或function.prototype.apply调用

作为对象的方法调用 和 作为普通函数调用

 1 window.a = 2;
 2 var obj = {
 3     a:1,
 4     getA:function(){
 5         console.log(this.a);
 6     }
 7 }
 8 obj.getA();       //输出1,作为对象的方法调用,this指向当前对象
 9 var x = obj.getA;
10 x();   //输出2,作为普通函数调用,this全部指向window对象。 

注意,不管x之前是obj.getA,还是其他某个对象的属性,只要最后是以x(),fun()这种方式调用的,均视为普通函数调用,此时this指向window对象

但是,在ECMAScript5的strict模式下,作为函数调用的 this被规定不会指向全局对象

 1 window.a = 2;
 2 var obj = {
 3     a:1,
 4     getA:function(){
 5         "use strict"
 6         console.log(this.a);
 7     }
 8 }
 9 var x = obj.getA;
10 x();   //underfined

作为构造函数调用

通常情况下,构造函数里的this指向返回的这个对象,但是如果构造器显示地返回了一个object类型的对象,则this指向这个返回的object对象

 1 var Myclass = function(){
 2     this.name = ‘beidan‘;
 3 }
 4 var obj = new Myclass();
 5 console.log(obj.name);//beidan
 6
 7 var Myclass = function(){
 8     this.name = ‘beidan‘;
 9     return{         //显示的返回一个对象,注意!既要是显示,即有return,也要是对象{}
10         name:‘test‘
11     }
12 }
13 var obj = new Myclass();
14 console.log(obj.name);//test

作为function.prototype.call或function.prototype.apply调用

  • 理解call,apply

call,apply都是为了改变函数体内部 this 的指向。例如,fun1.call()或者fun1.apply() 都是为了改变fun1函数内部的this指向。

二者的作用完全一样,只是接受参数的方式不太一样。

func1.call(this, arg1, arg2);        //参数列表arg1,arg2

func1.apply(this, [arg1, arg2]);   //参数数组 [arg1,arg2]

第一个参数指定那个了函数体内this对象的指向,他可以任何一个 JavaScript 对象(JavaScript 中一切皆对象),如果为null,则函数体内的this会指向默认的宿主对象,在浏览器中则是window。

第二个参数,call 需要把参数按顺序传递进去,而 apply 则是把参数放在数组里。

当你的参数不确定数量时用 apply ,然后把参数 push 进数组传递进去。或者也可以通过 arguments来获取所有的参数。这样看来,apply的使用率更高。

  • call,apply的用途

1.修正this的指向

比如,在实际开发中,会出现以下这种问题

1 document.getElementById(‘div1‘).onclick = function(){
2     console.log(this.id);   //div1
3     var func = function(){
4         console.log(this.id);
5     }
6     func();   //通过普通函数调用,this指向window,输出undefined
7 }

这时我们可以用call来修正func 函数内this的指向。

1 document.getElementById(‘div1‘).onclick = function(){
2     console.log(this.id);   //div1
3     var func = function(){
4         console.log(this.id);
5     }
6     func.call(this);   //使用call,使func函数内部的this指向当前的函数对象,输出div1
7 }

2.模拟继承(借用其他对象的方法)

  • 例子一:其他对象(banana)借用apple中的say方法
1 function fruits() {}
2 fruits.prototype = {
3     color: "red",
4     say: function() {
5         console.log("My color is "+ this.color);
6     }
7 }
8 var apple = new fruits;
9 apple.say();    //My color is red

但是,如果我们还有其它 2个对象 banana= {color : "yellow"} ,orange = {color:‘orange’},想使用say方法,但是又不想对它们重新定义say方法。

那么,我们可以用apply或者call 借用 fruit里面的say方法

1 banana = {
2     color: "yellow"
3 };
4 orange = {color:‘orange’};
5 apple.say.call(banana);     //My color is yellow
6 apple.say.apply(orange );    //My color is orange

也就是说,当一个 object 没有某个方法(本例子中banana没有say方法),但是其他的有(本例子中apple有say方法),我们可以借助call或apply用其它对象的方法来操作。

再看几个例子巩固记忆

  • 例子二:获取数组中的最大值和最小值
1 var numbers = [5, 458 , 120 , -215 ];
2 var maxInNumbers = Math.max.apply(Math, numbers),   //458
3     maxNumbers = Math.max.call(Math,5, 458 , 120 , -215, 666); //666

number 本身没有 max 方法,但是 Math 有,我们就可以借助 call 或者 apply 使用其方法。

以上就是this在JavaScript中不同情况下的指向。

周末来了,博主又要出去浪了o(∩_∩)o

时间: 2024-08-26 00:12:02

通俗易懂------this指向的相关文章

常用DOS命令之通俗易懂篇

目录 常用DOS命令之通俗易懂篇 Arp 命令 Assoc 关联 At 计划服务 Attrib 属性 Cd=chdir 目录 Cipher Cls 清屏 Color 颜色 Comp 比较 Compact 压缩 Copy 复制 Date 日期 Defrag 磁盘碎片 Del 删除文件 Dir 目录 Edit 编辑 Exit 退出 Expand 扩展 FC 比较文件 Find 查找 Format 格式化 FTP 文件传输 Ipconfig IP配置 Label 卷标 Md=mkdir 创建目录 Mo

ds6000com技术学派:通俗易懂的199O8836661对比 Git 与 SV

本文从 Git 与 SVN 的对比入手,介绍如何通过 Git-SVN 开始使用 Git,并总结平时工作高频率使用到的 Git 常用命令. 一.Git vs SVN Git 和 SVN 孰优孰好,每个人有不同的体验. Git是分布式的,SVN是集中式的 这是 Git 和 SVN 最大的区别.若能掌握这个概念,两者区别基本搞懂大半.因为 Git 是分布式的,所以 Git 支持离线工作,在本地可以进行很多操作,包括接下来将要重磅推出的分支功能.而 SVN 必须联网才能正常工作. Git复杂概念多,SV

这是一份通俗易懂的知识图谱技术与应用指南

从一开始的Google搜索,到现在的聊天机器人.大数据风控.证券投资.智能医疗.自适应教育.推荐系统,无一不跟知识图谱相关.它在技术领域的热度也在逐年上升. 本文以通俗易懂的方式来讲解知识图谱相关的知识.尤其对从零开始搭建知识图谱过程当中需要经历的步骤以及每个阶段需要考虑的问题都给予了比较详细的解释. 对于读者,我们不要求有任何AI相关的背景知识. 目录: 概论 什么是知识图谱 知识图谱的表示 知识抽取 知识图谱的存储 金融知识图谱的搭建 定义具体的业务问题 数据收集 & 预处理 知识图谱的设计

当this指针成为指向之类的基类指针时,也能形成多态

this指针: 1)对象中没有函数,只有成员变量 2)对象调用函数,通过this指针告诉函数是哪个对象自己谁. 1 #include<iostream> 2 using namespace std; 3 class Shape 4 { 5 public: 6 //void cal_display(Shape* this) 7 void cal_display(){ 8 display(); 9 this->display(); 10 } 11 private: 12 virtual vo

JavaScript中this指向

一.重点来了,this指向问题: 1.this指向之普通函数. 2.this指向之对象 3.this指向之构造函数 4.this指向之(call,apply)动态更改this指向. 二.具体分析如下 1.普通函数 // 第23行的调用者为null,this指向也为null,// 所以这时js把this指向了window对象,所以弹出的结果是// n,这样不好的是会污染全局函数内带this的操作,不能直接调用; 2.对象 // 第34行是对象的say方法指针指向了一个存在的函数say();// 所

Android gen根目录下自动生成的R文件指向问题

今天才弄明白,原来在调用vitamio包的时候使用它们的R文件,然后在迁入广告的时候出现了问题,但是瞎胡搞半天后把问题解决了,可没有明白这是什么原因. 今天更新应用又出现了相同的情况,无意中打开了gen的根目录妈蛋!发现里面的报名根本就不是我现在应用的包名.而是调用的那个工程的包名!这下终于找到根本原因了,但是怎么解决呢???----------->修改包名呗~~~~~~~可是你改了它又会自动生成了原来的那个,--------------后来终于发现原来这个R文件的包名适合manifest文件中

javascript中this的指向

作为一个前端小白在开发中对于this的指向问题有时候总是会模糊,于是花时间研究了一番. 首先this是JS的关键字,this是js函数在运行是生成的一个内部对象,生成的这个this只能在函数内部使用. 但是随着函数使用场合的不同,this的值会发生变化.有一个原则不会变,那就是this指的是,调用函数的那个对象. demo1: 此时函数运行的结果是 1 ,x是全局变量,因为匿名函数demo()是被window调用的,原始写法是window.demo(),因为demo()是被window调用的,所

了解Js中的this指向

Js中的this对象是在运行时基于函数的执行环境绑定的,其中的this指向很不好理解,一不小心就用错了位置;. this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象. 对于this指向的理解,我分以下几种情况来说, this的指向: 1.在全局函数中,this等于window: var name="cyp"; console.log(this); 2.当函数被用作为某个对象的方法调用时,this等于哪个对

sitecore+score 在 Experience editor 添加新元素时associateed content 指向错误

Q:在sitecore的Experience editor页面添加component时,子元素的路径指向错误.如图: A: 首先你要整理思路,这个设置可能是在哪,是template还是control layout.当然这里肯定是跟页面control有关. 1.我们需要找到这个button的control layout.因为我们的项目是集成了score,所以根据score的手册我们知道这个button的路径在/sitecore/layout/Renderings/BootstrapUI/Conte