gpt4 book ai didi

javascript - 有没有办法在JavaScript中修改 'this'?

转载 作者:搜寻专家 更新时间:2023-11-01 05:04:25 26 4
gpt4 key购买 nike

我找到了这个答案:How to modify "this" in javascript

但是我不喜欢它。肯定有某种方法可以修改this吗?

这是一个例子:

(function()
{

var a = function(v)
{
v += 10;

a = function()
{
console.log(this);
this += 5; // How to "unlock" 'this'?
console.log(this);
}.bind(v)

//a();
}

a(0);
a();

})();

小提琴: https://jsfiddle.net/ahvonenj/mz19aku6/

如果注释掉 this += 5部分,则控制台会说 thisNumber {[[PrimitiveValue]]: 10}。因此,我看不出为什么 Number(PrimitiveValue)类型不能增加5并打印出来的原因。我在这里想念什么?

有没有一种方法可以将引擎从 this视为 this来“突破”,并以某种方式将 this强制转换为它所说的-在这种情况下为 Number

也许通过某种方式使函数接受 to-be-converted this作为参数并返回一个新函数,该函数具有提供的 thisbind反弹的功能?

注意:我不希望通过可行的解决方案做任何实际的事情。我只是从技术 Angular 或其他方面感到好奇。

编辑:因此,一个名为Oriol的用户告诉我 this实际上不是数值为10的Number对象,而是Number文字。在这种情况下,这显然意味着 this += 5与编写 10 += 5几乎相同。我尝试像这样 checkout :
(function()
{

var a = function(v)
{
v += 10;

a = function()
{
console.log(this);
var p = this + 5; // How to "unlock" 'this'?
console.log(p);
}.bind(v)

//a();
}

a(0);
a();

})();

因此, var p = this + 5现在与编写 var p = 10 + 5基本相同,这是我们所期望的。

最佳答案

您可以将this视为伴随函数调用的隐式,不可变的值。

可以通过多种方式进行设置,最常见的方式是调用o.f()形式将this设置为o中的f。当然,也可以使用thiscallapply以及其他方式来设置bind
this与其他函数参数不同。如果是正常参数,则其值理论上可以更改。相反,它表示一个,这是this值的一种词汇占位符。换句话说,如果我打电话

f.call(5)

然后写
function f() { console.log(this); }

您可以将 this视为 ,按词法将替换为值5。因此,如果我尝试编写
function() { this += 5; }

您可以认为这相当于
function() { 5 += 5; }

这显然是胡说八道。我不能用其他东西代替值5。同样,如果我说
o = {
f: function() { this = o2; }
};

然后调用 o.f(),该函数实质上被重写为
function() { { f: ... } = o2; }

这是胡说八道。我无法重新分配对象的值。

由于 this是一个值,而不是参数,因此无法将其分配或更改。它不是赋值的有效左侧,只不过是 42而已。我们无法更改名为 42的值的值。我们无法更改名为 this的值的值。

这样做的原因是规范。从理论上讲,可以想象JavaScript的一种版本,其中 this 可变的。没有确定的理由为什么这不可能。毕竟,无论它来自何处,在函数中它只是一个值。这会造成困惑,并可能导致意外的行为,但是没有理由不起作用。

不支持此功能的主要原因是,这不是该语言的定义方式。如果您的问题是“为什么用这种方式定义语言”,那么这就是语言历史学家要回答的问题。但是,可以想象到这样做的充分原因,其中包括直观的代码行为。

考虑以下代码:
o = {
f: function() {
this.doSomething();
this = o2;
this.doSomething();
};

对于普通人来说,理解这样的代码将变得极其困难。由于对 this.doSomething()进行了中间更改,因此相同的两个 this调用执行两项不同的操作。仅此一个理由就足以禁止更改 this的值。更是如此,因为没有逻辑上的理由需要这样做,因为我可以用简单的 o2.doSomething()替换最后两行。

只是要清楚一点,当然,当我们谈论“更改 this”时,即使我们能够做到(我们不能做到),我们也不可能意味着以某种方式更改 this所指的外部值。我们都知道在以下情况下:
function a(x) { x = 2; }
var y = 1;
a(y);

x中对 a()的更改纯粹是本地的,并且不可能影响 y。当然,同样的事情同样适用于 this

关于包装原始的对象的另一注。我们知道我们可以写
o5 = Object(5);

得到一个包裹数字5的对象。现在,我可以在该对象上定义一个方法,如
o5.f = function() { console.log(this); };

并调用 o5.f()将记录
Number {[[PrimitiveValue]]: 5}

因此,由于此对象"is"数字,在这种情况下,我当然可以说
o5.f = function() { this++; };

但不是。 this不是数字5;这是一个包装5的对象。这是两个截然不同的东西。上面的功能基本上等于说
o5.f = function() { Object(5)++; }

产生
Uncaught ReferenceError: Invalid left-hand side expression in postfix operation

现在,我可以对对象进行算术运算,例如 Object(5) + 1,因为JS在添加对象之前会将对象强制为其基础基元。但是我不能比其他任何人重新分配这个对象。而且我无法修改对象基础的原始编号。创建包装器对象后,将永久锁定其基础的原始值。

因此,您的问题的答案是“不,没有办法更改 this”。这并不是说没有其他方法可以完成您想要完成的任何其他事情。

关于javascript - 有没有办法在JavaScript中修改 'this'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33153347/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com