将变量注入函数范围

时间:2017-05-23 22:33:04

标签: javascript node.js

何我调用函数将任意变量/函数注入其范围?我想定义一个可以自由调用一系列函数的“更新”函数,但它们必须在另一个范围内定义和绑定。

我尝试使用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();
}

4 个答案:

答案 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();
}