作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我找到了这个答案: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();
})();
this += 5
部分,则控制台会说
this
是
Number {[[PrimitiveValue]]: 10}
。因此,我看不出为什么
Number
(PrimitiveValue)类型不能增加5并打印出来的原因。我在这里想念什么?
this
视为
this
来“突破”,并以某种方式将
this
强制转换为它所说的-在这种情况下为
Number
?
to-be-converted this
作为参数并返回一个新函数,该函数具有提供的
this
和
bind
反弹的功能?
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
。当然,也可以使用this
,call
和apply
以及其他方式来设置bind
。this
与其他函数参数不同。如果是正常参数,则其值理论上可以更改。相反,它表示一个值,这是this
值的一种词汇占位符。换句话说,如果我打电话
f.call(5)
function f() { console.log(this); }
this
视为
,按词法将替换为值5。因此,如果我尝试编写
function() { this += 5; }
function() { 5 += 5; }
o = {
f: function() { this = o2; }
};
o.f()
,该函数实质上被重写为
function() { { f: ... } = o2; }
this
是一个值,而不是参数,因此无法将其分配或更改。它不是赋值的有效左侧,只不过是
42
而已。我们无法更改名为
42
的值的值。我们无法更改名为
this
的值的值。
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);
o5.f = function() { console.log(this); };
o5.f()
将记录
Number {[[PrimitiveValue]]: 5}
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/
我是一名优秀的程序员,十分优秀!