各种情况的 this指向 解析

JS 关于 this 指向的几种情况 一、this 指向 window 1、全局函数里面的 this 指向 window 2、箭头函数里面的 this 指向 window // 定义全局变量 title 与函数 foo var title = 'hello,world' // 注意:若使用 let 定义则不属于全局变量 function foo() { console.log(this.title) } function arrow() { let title = 'hello,arrow' return () => { re 阅读详情

全局环境下

在全局环境下,this 始终指向全局对象(window), 无论是否严格模式

console.log(this.document === document); // true

// 在浏览器中,全局对象为 window 对象:
console.log(this === window); // true

this.a = 37;
console.log(window.a); // 37

函数上下文调用

函数直接调用

普通函数内部的this分两种情况,严格模式和非严格模式。

非严格模式下,this 默认指向全局对象window

function f1(){
  return this;
}

f1() === window; // true

而严格模式下, this为undefined

function f2(){
  "use strict"; // 这里是严格模式
  return this;
}

f2() === undefined; // true

 

对象中的this

对象内部方法的this指向调用这些方法的对象,

  1. 函数的定义位置不影响其this指向,this指向只和调用函数的对象有关。
  2. 多层嵌套的对象,内部方法的this指向离被调用函数最近的对象(window也是对象,其内部对象调用方法的this指向内部对象, 而非window)。
//1
var o = {
  prop: 37,
  f: function() {
    return this.prop;
  }
};
console.log(o.f());  //37
var a = o.f;
console.log(a()):  //undefined

var o = {prop: 37};

function independent() {
  return this.prop;
}

o.f = independent;

console.log(o.f()); // logs 37

//2
o.b = {
  g: independent,
  prop: 42
};
console.log(o.b.g()); // logs 42

 

原型链中this

原型链中的方法的this仍然指向调用它的对象,与以上讨论一致;看个例子,

var o = {
  f : function(){ 
    return this.a + this.b; 
  }
};
var p = Object.create(o);
p.a = 1;
p.b = 4;

console.log(p.f()); // 5

可以看出, 在p中没有属性f,当执行p.f()时,会查找p的原型链,找到 f 函数并执行,但这与函数内部this指向对象 p 没有任何关系,只需记住谁调用指向谁。

以上对于函数作为getter & setter 调用时同样适用。

构造函数中this

构造函数中的this与被创建的新对象绑定。

注意:当构造器返回的默认值是一个this引用的对象时,可以手动设置返回其他的对象,如果返回值不是一个对象,返回this。

function C(){
  this.a = 37;
}

var o = new C();
console.log(o.a); // logs 37


function C2(){
  this.a = 37;
  return {a:38};
}

var b = new C2();
console.log(b.a); // logs 38

以上两个例子内部的this都指向对象o, 看到这里的你不妨在控制台执行下以上代码,看看对象 o 和 b ,这些是属于构造函数的内容了,此处不多做介绍。(C2函数中的this.a = 37 对整个过程完全没有影响的, 可以被忽略的)。

call & apply

当函数通过Function对象的原型中继承的方法 call() 和 apply() 方法调用时, 其函数内部的this值可绑定到 call() & apply() 方法指定的第一个对象上, 如果第一个参数不是对象,JavaScript内部会尝试将其转换成对象然后指向它。

例子:

function add(c, d){
  return this.a + this.b + c + d;
}

var o = {a:1, b:3};

add.call(o, 5, 7); // 1 + 3 + 5 + 7 = 16

add.apply(o, [10, 20]); // 1 + 3 + 10 + 20 = 34

function tt() {
  console.log(this);
}
// 返回对象见下图(图1)
tt.call(5);  // Number {[[PrimitiveValue]]: 5} 
tt.call('asd'); // String {0: "a", 1: "s", 2: "d", length: 3, [[PrimitiveValue]]: "asd"}

bind 方法

bind方法在ES5引入, 在Function的原型链上, Function.prototype.bind。通过bind方法绑定后, 函数将被永远绑定在其第一个参数对象上, 而无论其在什么情况下被调用。

function f(){
  return this.a;
}

var g = f.bind({a:"azerty"});
console.log(g()); // azerty

var o = {a:37, f:f, g:g};
console.log(o.f(), o.g()); // 37, azerty

DOM 事件处理函数中的 this & 内联事件中的 this

DOM事件处理函数

  1. 当函数被当做监听事件处理函数时, 其 this 指向触发该事件的元素 (针对于addEventListener事件)
  // 被调用时,将关联的元素变成蓝色
	function bluify(e){
	  //在控制台打印出所点击元素
	  console.log(this);
	  //阻止时间冒泡
	  e.stopPropagation();
	  //阻止元素的默认事件
	  e.preventDefault();      
	  this.style.backgroundColor = '#A5D9F3';
	}

	// 获取文档中的所有元素的列表
	var elements = document.getElementsByTagName('*');

	// 将bluify作为元素的点击监听函数,当元素被点击时,就会变成蓝色
	for(var i=0 ; i<elements.length ; i++){
	  elements[i].addEventListener('click', bluify, false);
	}

以上代码建议在网页中执行以下,看下效果。

内联事件
内联事件中的this指向分两种情况:

  1. 当代码被内联处理函数调用时,它的this指向监听器所在的DOM元素
  2. 当代码被包括在函数内部执行时,其this指向等同于 函数直接调用的情况,即在非严格模式指向全局对象window, 在严格模式指向undefined

页面的代码块

在浏览器内显示三个按钮

依次点击上边的三个按钮后在控制台的输出结果,

建议自己操作一遍以便于更好的理解。

setTimeout & setInterval

对于延时函数内部的回调函数的this指向全局对象window(当然我们可以通过bind方法改变其内部函数的this指向)
看下边代码及截图

//默认情况下代码
function Person() {  
    this.age = 0;  
    setTimeout(function() {
        console.log(this);
    }, 3000);
}

var p = new Person();//3秒后返回 window 对象
==============================================
//通过bind绑定
function Person() {  
    this.age = 0;  
    setTimeout((function() {
        console.log(this);
    }).bind(this), 3000);
}

var p = new Person();//3秒后返回构造函数新生成的对象 Person{...}

箭头函数中的 this

由于箭头函数不绑定this, 它会捕获其所在(即定义的位置)上下文的this值, 作为自己的this值,

  1. 所以 call() / apply() / bind() 方法对于箭头函数来说只是传入参数,对它的 this 毫无影响。
  2. 考虑到 this 是词法层面上的,严格模式中与 this 相关的规则都将被忽略。(可以忽略是否在严格模式下的影响)

因为箭头函数可以捕获其所在上下文的this值 所以

function Person() {  
    this.age = 0;  
    setInterval(() => {
        // 回调里面的 `this` 变量就指向了期望的那个对象了
        this.age++;
    }, 3000);
}

var p = new Person();

以上代码可以得到我们所以希望的值,下图可以看到,在setTimeout中的this指向了构造函数新生成的对象,而普通函数指向了全局window对象

var adder = {
  base : 1,
    
  add : function(a) {
    var f = v => v + this.base;
    return f(a);
  },

  addThruCall: function inFun(a) {
    var f = v => v + this.base;
    var b = {
      base : 2
    };
            
    return f.call(b, a);
  }
};

console.log(adder.add(1));         // 输出 2
console.log(adder.addThruCall(1)); // 仍然输出 2(而不是3,其内部的this并没有因为call() 而改变,其this值仍然为函数inFun的this值,指向对象adder

bind() & apply() 读者可以自行测试

对于是否严格模式示例代码(可以复制进控制台进行验证)

var f = () => {'use strict'; return this};
var p = () => { return this};
console.log(1,f() === window);
console.log(2,f() === p());
//1 true
//2 true

以上的箭头函数都是在方法内部,总之都是以非方法的方式使用,如果将箭头函数当做一个方法使用会怎样呢?
上例子

var obj = {
  i: 10,
  b: () => console.log(this.i, this),
  c: function() {
    console.log( this.i, this)
  }
}
obj.b();  // undefined window{...}
obj.c();  // 10 Object {...}

可以看到,作为方法的箭头函数this指向全局window对象,而普通函数则指向调用它的对象

关于this指向问题及改变this指向的方法 this指向详解 this指向在函数定义的时候是确定不了的,只有函数执行的时候才确定this到底指向谁 一般情况下this指向调用它的对象 下面我们来看看this被调用时的五种情况 思维导图 分析 1.作为对象方法被调用 当函数作为对象方法被调用时this指向该对象 var obj = { age: 18, fn: function () { console.log(this ===.. 阅读详情

相关推荐

JavaScriptthis 指向详细解析(对象、构造器篇)

title: JavaScriptthis 指向详细解析(对象、构造器篇)

shyerLan的博客 674

this指向

执行期上下文 当函数执行时(准确来说,是在函数发生预编译的前一刻),会创建一个执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境。 每调用一次函数,就会创建一个新的上下文对象,他们之间是相互独立且独一无二的。当函数执行完毕,它所产生的执行期上下文会被销毁。 this 解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是 thisthis 指向的是一个对象,这个对象我们称为函数执行的 上下文对象。 函数内 this指向【非常重要】 我们在《JavaScript 基础

qq_44278908的博客 686

七、永磁同步电机矢量控制(FOC)—MTPA控制及Simulink仿真

前面几节的内容已经完成Id=0控制策略的理论和仿真以及双闭环PI参数整定。在接下来几节中,将陆续讲解MTPA、弱磁控制等内容。

weixin_45182459的博客 8094

this指向有哪几种?一个文章让你理解明白!从此不在为this指向犯愁!

this指向有哪几种?一个文章让你理解明白!从此不在为this指向犯愁!

CSON_Fuck的博客 1646

this指向情况详解

this,函数的执行主体(不等价于执行上下文),取决于谁把这个函数执行的。大体上把this执行主体分为一下5类。

m0_52634705的博客 2797

this指向

this指向其实在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁 实际上this的最终指向的是那个调用它的对象 ???(这里还是有些问题的,下面进行解释) 1: function a(){ var user = "sslcsq"; console.log(this.user); // undefined console.log(this); // Window } a(); 按照我们上面说的this最终指向的是调用它的对象,这里的函数a实际是被Windo

sslcsq的博客 344

this指向及改变this指向的方法

原先总结过this指向问题,但看了大佬们写的之后,觉得自己遗漏了很多点,所以,结合大佬们的,重写一遍 一、函数的调用方式决定了 this指向不同: 普通函数调用,此时 this 指向 window function fn() { console.log(this); // window } fn(); // window.fn...

李天下 5万+

JS、Vue中的this指向 + 使用apply()、call()、bind()方法修改this指向

一些常见的JS、Vue中的this指向问题及示例,以及使用apply()、call()、bind()方法修改this指向时的注意事项及示例。

emmmmimport的博客 5332

关于普通函数this指向

普通函数this指向详解 this指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话不那么严谨,作为一般情况下是可以的) section1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window,但...

avbrv2393的博客 420

js中this指向问题总结

1. 默认绑定规则 (1) 全局作用下 this指向window console.log(this); (2) 函数独立调用下 this指向window function test(){ console.log(this); } test() 2. 隐式绑定规则 object.fun() 对象的方法,this指向调用这个方法的对象 函数执行,this才会指向,才有意义,每一个函数执行都会有一个自身的this指向。 函数不执行,this没意义。每个this都代表着函数的执行。 var a = 0;

rain19982016的博客 1317

JavaScript——浅谈“this

JavaScript——浅谈“this

m0_51697327的博客 365

JS中的this指向情况汇总

对于我们开发人员来说,this这个关键字可以说是再熟悉不过了,几乎所有主流的程序开发语言都带有this关键字。今天我们来说说在JavaScript中的this指向都有哪些情况(这也是面试中常常会问到的问题)。 JS中的this指向对于刚刚学习这门的语言的同学来说,有时往往会让人感到很困惑:明明觉得自己在很多时候应该是知道this指向的,可真正要你回答this指向到底有哪几种情况时,又往往说...

似水流年的博客 1万+

JavaScript函数this指向问题

一个好的心态和一个坚持的心很重要,很多冲着高薪的人想学习前端,但是能学到最后的没有几个,遇到困难就放弃了,这种人到处都是,就是因为有的东西难,所以他的回报才很大,我们评判一个前端开发者是什么水平,就是他解决问题的能力有多强。分享一些前端面试题以及学习路线给大家的时候,可以使用bind。如下(还是用上面的例子):var o = {name:‘xl’一个好的心态和一个坚持的心很重要。

2401_85123486的博客 816

this的五种情况

this:全局上下文中的this => window;快级上下文中没有自己的this ,它的this是继承所在上下文中的this;在函数的私有上下文,this情况分多种。 this与执行上下文:this是执行主体,EC(Excution Context)是执行上下文。 五种情况事件绑定:给元素的某个事件行为绑定方法,当事件行为触发,方法执行,方法中的THIS是当前元素本身(特殊:IE6~8中基于attachEvent方法实现的DOM2事件绑定,事件触发,方法中的THIS是WINDOW而不是元素

qq_39298448的博客 1234

this指向问题汇总

普通函数: 1、this总是代表着他的直接调用者,例如obj.fun(),那么fun()中的this就是obj; 2、调用的时候,没有任何前缀,则指向window,new的时候,指向new出来的对象; 3、在默认情况下(非严格模式),没找到直接调动者,则this指向window; 4、在严格模式下,没有直接调用者的函数中的this是undefined; 5、使用call、apply、bind绑定的......

Jermyo的博客 4292

关于this指向的各种情况

关于this指向的讲解来了,速看

尔东尘的博客 378

JS中的 this 指向的七种场景

this指向问题 this是一个关键字,指向一个对象,在不同的调用环境this指向的对象也不一样。 1、全局this指window console.log(this) 2、全局函数里的this指window function fn () { console.log(this) } fn() 3、事件处理函数里的this指绑定事件的DOM对象(不一定是事件源,哪个对象绑定就是那个对象) document.querySelector('#box').onclick =

kilig 898

this指向的四种情况

this 是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件。 this 的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。 当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文)。这个记录会包含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息。this 就是这个记录的一个属性,会在函数执行的过程中用到。 判断this指向的四种情况 1. new 使用 new 来调用函数,或者说发生构造函数调用时,会自动执行下面的操作。 ...

jiandan1127的博客 1540

SpringBoot一次请求中缓存数据,请求结束就清除的4种方法,你会几种?

通过以上四种方法,你可以在 SpringBoot 的一次请求中缓存数据,并在请求结束后自动清除这些缓存数据。使用 ThreadLocal:适用于需要跨多个方法调用的缓存数据,灵活性高,但需要注意内存泄漏问题。使用 AOP:适用于全局性的缓存管理,代码更加优雅,但需要对 AOP 有一定的了解。使用 ServletRequestListener:适用于简单的请求生命周期管理,配置简单,但功能相对有限。使用 HttpServletRequest 的 setAttribute 和 getAttribute。

java专栏 1267

SDL3头文件和库(包含静态库和动态库)

SDL3头文件和库(包含静态库和动态库)

上一篇: 浏览器断网事件offline和联网事件online
下一篇: VUE按需引入ANT DESIGN报错“ERROR IN ./NODE_MODULES/ANT-DESIGN-VUE/ES/EMPTY/STYLE/INDEX.LESS”解决办法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光机上敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值