this--浅析

电力电子技术进阶:从基础到实战的完整学习路径 本文系统阐述了电力电子技术从基础到实战的完整学习路径。首先解析了电力电子作为“电能魔术师”的核心作用,随后深入剖析了数学工具、电路电磁场与半导体器件三大基础支柱。文章重点讲解了DC-DC、DC-AC、AC-DC等核心变换拓扑,并探讨了从经典PID到现代模型预测控制(MPC)的控制策略。最后,分享了硬件设计、软件调试、电磁兼容(EMC)等实战经验与前沿趋势,为学习者提供了清晰的进阶指南。 阅读详情

从开始接触this到真正理解this之前,可能会对this有一些误解, 如:

  1. 第一种常见的倾向是认为this指向函数自己;

  2. 第二常见的对this的含义的误解,是它不知怎的指向了函数的作用域。

明确地说,this不会以任何方式指向函数的 词法作用域。作用域好像是一个将所有可用标识符作为属性的对象,这从内部来说是对的。但是JavasScript代码不能访问作用域“对象”。它是 引擎 的内部实现。

什么是this?

上面已经列举了各种不正确的臆想,现在来看this机制是到底如何真正工作的。

我们早先说过,this不是编写时绑定,而是运行时绑定。它依赖于函数调用的上下文条件。this绑定和函数声明的位置无关,反而和函数被调用的方式有关。

当一个函数被调用时,会建立一个活动记录,也称为执行环境。这个记录包含函数是从何处(call-stack)被调用的,函数是 如何 被调用的,被传递了什么参数等信息。这个记录的属性之一,就是在函数执行期间将被使用的this引用。

简单来说, 大概有4种:

  1. 默认绑定
  2. 隐式绑定
  3. 显示绑定
  4. new绑定
    特别要注意隐式赋值,比如传参 、赋值的时候,实际上对象和函数是两个地址, 如果不加上对象的调用,单独调用实际上就是在全局环境调用函数。下面一一道来。

1. 默认绑定

最常见的情况:独立函数调用。可以认为这种this规则是在没有其他规则适用时的默认规则。
考虑如下代码:

function foo() {
    console.log(this.a);
}
var a = 1;  // 全局变量
foo();  // 1

当foo()被调用时,this.a解析的是全局变量a。为什么?因为在这种情况下,foo()是在全局环境下被调用的,对此方法调用的this实施了 默认绑定,所以使this指向了全局对象。

如果在严格模式下,那么对于 默认绑定 来说全局对象是不合法的,所以this将被设置为undefined。

function foo() {
    "use strict";
    console.log(this.a);
}
var a = 1;  // 全局变量
foo();  // TypeError: 'this' is undefined

2. 隐式绑定(Implicit Binding)

另一种要考虑的规则是:调用函数的是一个环境对象(context object)。
考虑如下代码:

function foo() {
    console.log(this.a);
}
var obj = {
    a: 1,
    foo: foo;
};
obj.foo();  // 1

首先,注意foo()被声明然后作为引用属性添加到obj上的方式。无论foo()是否一开始就在obj上被声明,还是后来作为引用添加(如上面代码所示),都是这个 函数 被obj所“拥有”或“包含”。

只有对象属性引用链的最后一层是影响调用点的。比如:

function foo() {
    console.log(this.a);
}
var obj1 = {
    a: 1,
    foo: foo;
};
var obj2 = {
    a: 2,
    obj1: obj1;
};
obj2.obj1.foo();  // 1
隐式丢失(Implicitly Lost)

this绑定最常让人沮丧的事情之一,就是当一个 隐含绑定 丢失了它的绑定,这通常意味着它会退回到 默认绑定, 根据strict mode的状态,结果不是全局对象就是undefined。

考虑如下代码:

function foo() {
    console.log(this.a);
}
var obj = {
    a: 1,
    foo: foo;
};
var a = 'global';
var fn = obj.foo;  // 将函数引用复制给fn
fn();  // 'global'

尽管fn似乎是obj.foo的引用,但实际上它只是另一个foo自己的引用而已。另外,起作用的调用位置是fn(),一个直白,毫无修饰的调用,因此 默认绑定 适用于这里。

这种情况发生的更加微妙,更常见,更意外的方式,是当我们考虑传递一个回调函数时:

function foo() {
    console.log(this.a);
}
function foo2(fn) {
// 这里 fn 仅仅是 foo 的一个 引用
    fn();    // 调用位置
}
var obj = {
    a: 1,
    foo: foo;
};
var a = 'global';
var fn = obj.foo;  // 将函数引用复制给fn
foo2(obj.foo);  // 'global'

js里参数都是按值传递的, 所以在执行foo2(obj.foo)的时候,所以obj.foo将foo的引用值传给了fn,之后运行回调函数fn(), 结果跟上一个例子一样。

那么如果接收你所传递回调的函数不是你的,而是语言内建的呢?没有区别,同样的结果。

function foo() {
    console.log(this.a);
}
var obj = {
    a: 1,
    foo: foo;
};
var a = 'global';
setTimeout(obj.foo, 1000) // 'global'

如我们刚刚看到的,我们的回调函数丢掉他们的this绑定是十分常见的事情。

不管哪一种意外改变this的方式,你都不能真正地控制你的回调函数引用将如何被执行,所以你(还)没有办法控制调用点给你一个故意的绑定。我们很快就会看到一个方法,通过 固定 this来解决这个问题。


显示绑定(Explicit Binding)

JavaScript语言中的“所有”函数都有一些工具(通过他们的[[Prototype]])可以用于这个任务。特别是,函数拥有call(..)和apply(..)方法。绝大多数被提供的函数,当然还有你将创建的所有的函数,都可以访问call(..)和apply(..)。

call(..)和apply(..)接收的第一个参数都是一个用于绑定this的对象,之后使用这个指定的this来调用函数。因为你已经直接指明你想让this是什么,所以我们称这种方式为 显示绑定(explicit binding)。

考虑如下代码:

function foo() {
    console.log(this.a);
}
var obj = {
    a: 1
};
var a = 'global';
foo.call(obj);  // 1

通过foo.call(..)使用 明确绑定 来调用foo,允许我们强制函数的this指向obj。

如果你传递一个简单原始类型值(string,boolean,或 number类型)作为this绑定,那么这个原始类型值会被包装在它的对象类型中(分别是new String(..),new Boolean(..),或new Number(..))。这通常称为“boxing(封箱)”。

注: 就this绑定的角度讲,call(..)和apply(..)是完全一样的。它们确实在处理其他参数上的方式不同。

不幸的是,单独依靠 明确绑定 仍然不能为我们先前提到的问题提供解决方案,也就是函数“丢失”自己原本的this绑定,或者被第三方框架覆盖,等等问题。

硬绑定(Hard Binding)

考虑这段代码:

function foo(sth) {
    console.log(this.a, sth);
    return this.a + sth;
}
var obj = {
    a: 1;
}
var bar = function() {
    return foo.apply(obj);
};
bar();   // 1
setTimeout(bar, 100);  // 1
// bar 将 foo的this应绑定到 obj
bar.call(window);  // 1

代码中, 创建了一个函数bar(),在它的内部手动调用foo.call(obj),由此强制this绑定到obj并调用foo。无论你过后怎样调用函数bar,它总是会使用obj调用foo。这种绑定即明确又坚定,所以我们称之为 硬绑定(hard binding)。

用 硬绑定 将一个函数包装起来的最典型的方法,是为所有传入的参数和传出的返回值创建一个通道:

function foo(sth) {
    console.log(this.a, sth);
    return this.a + sth;
}
var obj = {
    a: 1;
}
var bar = function() {
    return foo.apply(obj, arguments);
};
var baz = bar(2);   // 1 2
console.log(baz);  // 3

另一种表达这种模式的方法是创建一个可复用的帮助函数:

function foo(sth) {
    console.log(this.a, sth);
    return this.a + sth;
}
function bind(fn, obj) {
    return function() {
        return fn.apply(obj, arguments);
    };
}
var obj = {
    a: 1;
}
var bar = bind(foo, obj);
var baz = bar(2);   // 1 2
console.log(baz);  // 3

硬绑定 是一个很常用的模式,它已作为ES5的内建工具提供:Function.prototype.bind,像这样使用:

function foo(sth) {
    console.log(this.a, sth);
    return this.a + sth;
}
var obj = {
    a: 1;
}
var bar = foo.bind(obj);
var baz = bar(2);   // 1 2
console.log(baz);  // 3

bind(..)返回一个硬编码的新函数,它使用你指定的this环境来调用函数。


new绑定(new Binding)
  • 一个全新的对象会凭空创建(就是被构建)
  • 这个新构建的对象会被接入原形链([[Prototype]]-linked)
  • 这个新构建的对象被设置为函数调用的this绑定
  • 除非函数返回一个它自己的其他 对象,这个被new调用的函数将 自动 返回这个新构建的对象。

考虑这段代码:

function foo(a) {
    this.a = a;
}

var bar = new foo(2);
console.log(bar.a);  // 2

通过使用new来调用foo(..),我们构建了一个新的对象并将这个新对象作为foo(..)调用的this。 new是函数调用可以绑定this的最后一种方式,我们称之为 new绑定(new binding)。


总结: this绑定基本有4中可能:
1. 默认绑定,指向顶层对象,在严格模式下, 指向undefined,混杂模式下指向全局对象;
2. 隐式绑定,考虑调用位置是否有上下文,或者说是否被某个而对象拥有或者包含,当函数引用有上下文对象时,隐式绑定规则会把函数调用中的this绑定到这个上下文对象。此时,存在的一个最大的问题就是被隐式绑定的函数会丢失绑定对象,也就是说它会应用默认绑定。
3. 显示绑定,call、apply、bind 绑定,将传给他们的第一个参数作为绑定this的对象。(硬绑定会通过Function.prototype.bind()创建一个新的包装函数,这个函数会忽略它当前的this绑定(无论绑定的对象是什么),并把我们提供的对象绑定到this上)。
4. new绑定,this指向新创建的实例对象。

bind的简单实现:

function bind(fn, obj){
    return function() {
        fn.apply(obj, arguments);
    };
}

上述四种绑定的优先级:
1. 默认绑定的优先级最低。
2. 显示绑定高于隐式绑定;
3. new绑定高于显示绑定;
所以有显示 new绑定 > 显示绑定 > 隐式绑定 > 默认绑定 。


以上是学习总结,请多指正!

TriCore架构-如何将系统刷成HSM 本文介绍了芯片刷写操作流程:首先加载project_Merge.s19文件,进入UCB界面展开BMHD0_ORIG和BMHD1_ORIG。重点说明需要将STAD地址从原始值A0000000修改为0XA00A0000,并详细描述了编辑、更新和写入芯片的步骤。最后提示在HSM刷写过程中如遇错误可能需要输入密码。该操作涉及关键地址修改,需谨慎执行。 阅读详情

相关推荐

基于Halium 9为小米平板4移植Ubuntu Touch:内核适配与驱动调试实战

在移动设备生态中,Linux内核作为核心,通过硬件抽象层(HAL)管理底层硬件驱动,为上层系统提供统一接口。其模块化设计允许深度定制,是实现跨平台移植的技术基础。Halium项目正是利用这一原理,构建了一个中间层,将安卓内核的硬件支持能力“翻译”成标准Linux发行版能识别的格式,从而在手机、平板等移动设备上运行Ubuntu Touch、postmarketOS等移动Linux系统,极大地拓展了老旧设备的再利用价值。这一技术为开发者提供了在常见安卓硬件上进行Linux系统开发与定制的可能,尤其在嵌入式与物联

weixin_42639246的博客 372

js的动态绑定事件和静态绑定事件的this的指向

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script type="text/javascript" charset="utf8" src="jquery-3.2.1.min.js"></script> </head> <body> <

3441

【Spreadsheet】香港规范结构设计电子表格库开发方案

深入理解香港本地规范特点和要求结合国际先进标准(Eurocode) 的技术内容考虑香港地理环境特殊性 (台风、地质等)建立完善的质量控制体系保持持续更新维护的能力。

hmywillstronger的博客 1362

解决js类定义里面绑定事件this指向问题

问题分析 最近一个js问题困扰了2小时:现在我们需要定义一个类,类里面初始化对象时会绑定事件,然后销毁方法会解绑事件,精简代码如下:(这里使用es6定义类的方式,使用原始的function思路也是一样的) class Test { constructor() { this.width = 0; } //初始化对象时使window绑定事件resize,设置对象宽度 init(...

iamlujingtao的博客 2544

[MR]RCM约束下的手术机器人

RCM(Remote Center of Motion)约束,通俗讲就是做微创手术时,机械臂插进身体,机械臂受身体的插入点的约束,不能乱动。 相关参考论文 Task Control with Remote Center of Motion Constraint for Minimally Invasive Robotic Surgery ...

土豆大叔的博客 4579

华为昇腾Atlas200DK. CANN模型推理——目标检测结果不对(无检测结果)的问题解决

目录前言问题描述问题排查1.后处理模块问题排查2.预处理模块问题排查3.模型问题排查4.算法bug问题排查5.AI板卡问题排查6.模型精度问题排查6.模型推理问题解决:模型输入数据与预处理不同后记 前言 上周我在华为昇腾Atlas200DK中部署nanodet和yolov5时,出现了目标检测结果不对(没有检测到任何物体),困扰了整整三天,最后找到原因并圆满解决,在这里记录一下debug过程。 以上测试均在python中完成。 问题描述 第一天上午,我首先将nanodet由pytorch的.pth模型转换为.

qq_41035283的博客 5604

JavaScript中的this绑定规则

文章目录一.绑定方式二.一些函数的this分析1.setTimeout2.div的点击3.数组的forEach三.this绑定优先级规则1.默认规则的优先级最低2.显示绑定优先级高于隐式绑定3.new绑定优先级高于隐式绑定4.new绑定优先级高于bind5.this规则之外– 忽略显示绑定6.this规则之外- 间接函数引用7.箭头函数简介this绑定规则四.面试题 一.绑定方式 1.this的5种绑定方式: 默认绑定(非严格模式下this指向全局对象, 严格模式下this会绑定到undefined)

前端学习博客 922

VS Code ESP-IDF无法找到源文件、头文件波浪线解决

背景:想要编译小智AI项目,可以正常编译。但是一些头文件,例如#include <nvs.h>等无法找到。

Hot_Ant的博客 1491

【js学习之路】事件绑定函数中,将this换成调用对象导致的问题

本人js初学,也想写一些博客记录我的js学习之路。 今天在写一个简单的事件绑定的时候发现将this换成调用对象的时候发生错误。 代码如下:<!DOCTYPE html> <html> <head> <title>AAA</title> <meta charset="UTF-8"> </head> <body> <p>AAAA</p> <p>BBBB</p>

Killpower的博客 1160

基于深度学习的智能监考系统(UI界面 + YOLOv8/v7/v6/v5代码 + 训练数据集)

行为检测与识别:能够自动识别考生在考试中的异常行为,如作弊、看手机、交头接耳等。实时监控:在考试期间,系统能够对考生的行为进行实时监控,及时发出警报。用户交互:通过简洁易用的UI界面,便于监考人员进行实时监控、查看警报和视频回放等操作。行为分析与反馈:系统能够识别出考生的违规行为,并提供反馈。本文详细介绍了如何构建基于YOLOv5的智能监考系统,从数据集的准备、YOLO模型的训练,到UI界面的设计与实现,展示了一个完整的深度学习监控系统。

YOLO 781

IPD流程中的RR\OR\IR\PB\SR\AR\CR等名词汇总(基于新的产品包需求架构)

RR:Raw Requirement,原始需求=》IR:Initial Requirement,初始需求=》SR:System Requirement,系统需求=》AR:Allocated Requirement,分配需求=》CR:Process Change Requirement,流程变更需求。

a1809032425的博客 3191

JS中绑定this的四种方式

let car = { type: 'truck', size: 'big', description: function(){ console.log( "The Car is ", car.type , ". And the size is ", car.size, "." ); } } 这里面多次出现了car.***,语句上显得十分冗余,我们可以借助this来简化代码: let car = { type: 'truck', size: 'bi.

拯救世界的光太郎 919

整车的智能配电系统

本文探讨了汽车电网安全的重要性,分析了传统汽车电网的现状,并重点介绍了半导体在汽车智能配电系统中的作用。半导体凭借其单向导电性和可控性,如二极管、MOSFET等,提供了更高效、安全的电力控制。通过对比传统保险丝与半导体器件,阐述了半导体在过流保护、电压监测和故障诊断方面的优势,强调其在减少安全隐患、提高能源管理和续航里程方面的贡献。极氪智能配电系统展示了如何运用半导体技术实现整车能源的精细化管理,降低维修成本,减少线束复杂性,提升安全性能。

让你爱上电路设计 1612

浅析this指针

this指针是一个自引用指针,通常用于指向对象自身。本文将深度探讨this指针的核心特性、注意要素、应用场景和相关案例。

螺蛳粉只吃炸蛋的走风的博客 962

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

浅析C++中的this指针

     有下面的一个简单的类:class CNullPointCall{public:    static void Test1();    void Test2();    void Test3(int iTest);    void Test4();private:    static int m_iStatic;    int m_iTest;};int CNullPointCal

寒星轩 6万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

浅析C++this指针

什么是this指针? this指针的作用是什么? this指针有哪些特性? this指针传参方式? 为什么叫this指针而不是引用呢? this指针有没有可能为空? this指针容易混淆点 1) 什么是this指针? this是指向实例化对象本身时候的一个指针,里面存储的是对象本身的地址,通过该地址可以访问内部的成员函数和成员变量。举例来说:当你进入一个房子后,你可以看见桌子、椅子、地板等,...

番茄都是西红柿 1650

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++ this 指针 浅析

本文分三部分。第一部分this指针的的产生原因,即为了让不同对象调用同一函数时,通过this指针来对不同对象的地址加以区别实现函数共用。第二部分讲述this指针的使用,函数的返回值为对象本身或者函数的输入参数与成员变量相冲突时都需要this指针帮助实现。第三部分,讲述this指针几个常见的易混淆的问题。

稚枭天卓 1378

JavaScript this浅析

在做聊天室的过程中,我遇到了一个小问题,在javascrip中,有没有和c语言中的静态变量类似的对象呢? 答案就在闭包之中。 而说到闭包,又得说说那个我视之如地雷的this。this搞明白了,闭包这东西耍起来能不溜吗。 总结起来,是很简单的,只有在函数作为对象的方法被调用时,this才指向这个对象,否则,皆指向window对象。 举个例子 var o...

affmu44860的博客 131

浅析JS中的this

关于我对this的一点见解

m0_72552013的博客 298

浅析 this指针

1. this指针的用处:  一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。  例如,

享受开发技术,享受计算机科学 700

浅析c++中的this指针

1. 概念 在c++中,每个对象都能通过this指针来访问自己的地址。this指针是所有类的成员函数隐含的参数,可以指向调用的对象。 2.代码示例 class CDocument { public: virtual void Serialize() {} void OnFileOpen() { Serialize(); } }; class CMyDoc : public CDocument { public: virtual void Serialize() { cout &

www_dong的博客 211

java中.this_浅析java中的this

如果文章对你有所帮助,请点喜欢并关注,这将是我最大的动力,谢谢首先我们都知道this是用在构造方法中,为了调用对象的变量或者调用对应构造方法时使用的,而this又是如何工作的,以及this的使用规则是什么,具体如下。1在这里,this(参数)根据参数里的类型匹配相对应的构造函数,如上,color是String类型,自动匹配到pen(String av)里的形参类型也是String类型,成功调用构造...

weixin_31466565的博客 265

浅析js中的this

很多人可能会有疑问,this到底是什么?为什么this的值变化多端?   首先我们来概括下this.   this是一个对象,一般存在于函数中,表示当前函数的执行上下文; 值得一提的是,当函数在执行后,this才有绑定的对象,函数未执行时,this没有内容 接下来我们看看在不同场景下的this的指向   1.函数默认执行 :此时this指向Window fun...

139

C++浅析this指针

C++类中this指针的理解 先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my具有myclass类型。理解了这个,就好解释this了,my里的this 就是指向my的指针。如果还有一个变量myclass mz,mz的this就是

qingyun_wudaoletu的博客 933
上一篇: vue动态数据绑定3--深层次数据变化逐层往上传播
下一篇: [[Prototype]]--浅析
林雨静
博客等级 码龄10年 11粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值