何我调用函数将任意变量/函数注入其范围?我想定义一个可以自由调用一系列函数的“更新”函数,但它们必须在另一个范围内定义和绑定。
我尝试使用with
,但它不起作用。
另外,我知道有很多解决方案,例如传递调用或定义参数列表的对象并绑定它们的对象,但由于“update”必须由用户定义,因此其签名必须只是一个没有参数的简单函数(就像在下面的代码中一样)但它必须能够访问具有任意绑定的一长串函数。
基本上:update()函数不能在其签名中包含任何参数,并且其中的函数必须只能用它们的名称来调用(没有this.printSize(),obj.printSize()等等)。
function obj (size) {
this.printSize = function () {
console.log(size);
}
}
const obj1 = new obj(1);
const obj2 = new obj(2);
function update () {
printSize();
}
with(obj1) {
update();
}
with(obj2) {
update();
}
答案 0 :(得分:2)
建议观众自行决定:
function evalWith(obj, func) {
with(obj) return eval('(' + func + ')')();
}
// Example:
function obj(size) {
this.printSize = function() {
console.log(size);
}
}
const obj1 = new obj(1);
function update() {
printSize();
}
evalWith(obj1, update); // 1

答案 1 :(得分:1)
javascript中的变量绑定是在函数创建上设置的,而不是调用。
因此,您唯一有效的选择是命名对象中需要的变量,并在以后填充。或者,您可以将变量设置为全局命名空间(例如)窗口。
不幸的是,无法获取函数的内容并在以后重新评估它。
你能做的最多就是改变传递给函数的参数的值,使用call或者其他人提到的apply。
答案 2 :(得分:0)
你试过吗
function obj (size) {
this.printSize = function () {
// presumably do something with "this"
console.log(size);
}.bind(this);
}
答案 3 :(得分:0)
您需要在每次调用之前创建一个obj实例
function obj (size) {
printSize = function () {
console.log(size);
}
}
function update () {
printSize();
}
const obj1 = new obj(1);
with(obj1) {
update();
}
const obj2 = new obj(2);
with(obj2) {
update();
}