javascript - JavaScript 中的 Ruby 样式 block ?

标签 javascript debugging closures

但我想做的是能够在 JavaScript 中传递将在特定范围内执行的任意代码,类似于在 Ruby 中生成 block 的方式。

以此为例:

function injectHook() {
    return function(block) {
        block();
    }
}

(function() {
    var a = 1;
    self.inject = injectHook();
})();

inject(function() {
    a++;
});

inject(function() {
    console.log(a);
});

上面的尝试不会成功,因为 injectHook 是在不同的范围内定义的,并且将无法访问 a

这里的主要用例是复杂代码的实时调试。

编辑:I started a GitHub project around this question

最佳答案

首先,好问题!我至少花了一个小时试图想出一个相对简单的实现方法!这就是我解决这个问题的方法:

Object.prototype.yield = function() {
    return "try { (" + this + ")() } catch (e) { console.log('**Context error** ' + e) }";
}

// first yielding block
var y1 = (Object(function() { 
    console.log('in y1, but still in the right context...');
    a++;
})).yield();

// second yielding block
var y2 = (Object(function() { 
    console.log('in y2, but still in the right context...');
    a = a + 5;
})).yield();

// voila
(function() {
    var a = 1;
    eval(y1);
    eval(y2);
    a--;
    eval(y2);
    console.log(a); // a == 11 now as expected
})();

// another block without an `a`
(function() {
    var b = 1;
    eval(y1); // gracefully fails
})();

从可以在多个位置产生的意义上讲,这往往更像 ruby 。不仅如此,它还更进一步,能够屈服于特定的代码块(y1y2y3 等。 .)

我希望这个答案有用,你的问题很好!

关于javascript - JavaScript 中的 Ruby 样式 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6713538/

相关文章:

c - 从 PC 寄存器值中查找行号信息

perl - 如何将调试器附加到正在运行的Perl进程?

javascript - 这是 JavaScript 闭包错误吗?

Swift:重复调用通过身份函数传递的闭包会导致 EXC_BAD_ACCESS code=2

javascript - 闭包如何访问被破坏的变量?

c# - Google AngularJS 框架 - 值得冒险吗?

javascript - 如何检测 express.js 应用程序中的环境?

javascript - 如何让response.success()等待?

Javascript过滤器根据关联数组中的字符串在对象中查找id

Java 斐波那契数列计时器