提问人:jeffbRTC 提问时间:2/2/2021 最后编辑:jeffbRTC 更新时间:2/2/2021 访问量:143
为什么我不能使用左手赋值来修改函数结果的值?
Why can't I use left hand assignment to modify value of function result?
问:
我正在尝试为函数返回给我的内容分配一个值。我知道乍一看这听起来可能很愚蠢,但我正在完成的是直接引用警报(在 C++ 中,这称为左值)并对其进行修改。
function foo() {
return alert;
}
foo() = "zoo"
井
var name = "alert";
var ref = (reference) => reference.split('.').reduce((o,i)=>o[i], window)
ref(name) = new Proxy(ref(name), {
apply: (target, thisArg, args) => {
console.log(thisArg)
console.log(args)
return "Alert called";
}
});
我现在可以做,
var name = "alert";
window[name] = new Proxy(window[name], window), {
apply: (target, thisArg, args) => {
console.log(thisArg)
console.log(args)
return "Alert called";
}
});
但是对于复杂的对象,它会变得复杂,例如"HTMLCollection.prototype"
即使使用 eval,它也不起作用
var name = "alert";
eval(name) = new Proxy(eval(name), {
apply: (target, thisArg, args) => {
console.log(thisArg)
console.log(args)
return "Alert called";
}
});
答:
你几乎是在要求变量变量,即按名称解析变量以进行赋值,而这只有在 Javascript 中非常非常有限的容量中才有可能。唯一可以使用它的时间是在分配属性名称为动态的对象属性时:
foo[bar] = baz;
函数返回值,而不是引用或变量,因此分配给函数的返回值是完全不可启动的。
你在这方面走在正确的轨道上:
(reference) => reference.split('.').reduce((o,i)=>o[i], window)
它将带点名称解析为值,但同样,您不能分配给该解析的值。当函数执行 时,它返回 alert
引用的值,类似于 。因此,您尝试执行的操作等同于:return alert
function () { ... }
function () { ... } = new Proxy(...)
这是行不通的。你不能是“name”,你只能返回 name 引用的值。return
你的函数必须返回你要找的那个的父对象,然后你可以分配给它的属性,例如:
ref(foo)[bar] = baz;
这相当于,例如:
window['alert'] = new Proxy(...)
即,在引用的对象上设置属性。这显然很好用。alert
window
由于上述函数的使用有些笨拙,因此最好将其包装成如下所示的函数:ref
assign(foo, baz)
这可能看起来像这样:
function assign(name, obj) {
const path = name.split('.');
const parent = path.slice(0, -1).reduce((o, i) => o[i], window);
parent[path[path.length - 1]] = obj;
}
const name = 'foo.bar.baz';
assign(name, new Proxy(ref(name), { ... }));
请注意,有问题的对象必须作为 上的属性可用 though(或您可以传递到的其他根对象);没有(理智的)方法可以以这种方式分配给 OR 或任何局部函数变量。window
assign
let
const
例如,这可以工作:
let foo = { bar: {} };
assign('bar', new Proxy(...), foo);
这不会发生:
let foo = {};
assign('foo', new Proxy(...));
评论
上一个:是否有反向逻辑无效赋值?
评论
alert()
window
alert()
alert
const foo = window.alert
Proxy
eval
eval
assign('foo.bar', new Proxy(...))
assign
o[i] = proxy