但我想做的是能够在 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
。
这里的主要用例是复杂代码的实时调试。
最佳答案
首先,好问题!我至少花了一个小时试图想出一个相对简单的实现方法!这就是我解决这个问题的方法:
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 。不仅如此,它还更进一步,能够屈服于特定的代码块(y1
、y2
、y3
等。 .)
我希望这个答案有用,你的问题很好!
关于javascript - JavaScript 中的 Ruby 样式 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6713538/