有人叫她“熟食铺子”,因为只有熟食店会把那许多颜色暖热的肉公开陈列;
又有人叫她“真理”,因为据说“真理是赤裸裸的”;
而鲍小姐并未一丝不挂,所以他们修正为“局部的真理”。
《围城》 — 钱钟书
/**
* Execute javascript code within specific scope
* @param {Function} fn scoped function
* @param {Object} imports An object defines required local variables
* @return {Function} A function that can trigger to run code in specific scope
*/
function scopedRunner(fn, imports) {
var rfunc = /^function\s+(?:[^(]*)\(([^)]*)\)\s*{([^]*)}$/;
var found = String(fn).match(rfunc) || [,,'return ' + fn];
var args = found[1] || '';
var stmt = found[2] || '';
var body = Object.keys(imports || {}).reduce(function (ret, key, idx) {
return ret + (idx ? ', ' : 'var ') + key + ' = __locals__["' + key + '"]';
}, '') + '; return function (' + args + ') {' + stmt + '};';
return Function('__locals__', body).call(null, imports);
}
The following are some examples.
// e.g 1
void function () {
scopedRunner(
function (m, n) {
var result = (x + y) + (m + n);
console.log('The meaning of life is:', result); //=> 42
},
{ x: 10, y: 1 }
).call(null, 30, 1);
}();
// e.g 2
void function () {
var result = scopedRunner(
'times(a, b)',
{ a: 6, b: 7, times: (x, y) => x * y }
)();
console.log('The meaning of life is:', result); //=> 42
}();
// e.g 3
Object.prototype.__eval = function (expr) { return scopedRunner(expr, this)(); };
void function () {
var obj = { a: 6, b: 7, times: (x, y) => x * y };
var result = obj.__eval('times(a, b)');
console.log('The meaning of life is:', result); //=> 42
}();
// e.g 4
var take = (scope => scopedRunner(scope.eval, scope.with)());
void function () {
var a = 6, b = 7, times = (a, b) => a * b;
// take result out from evaluated value within specific scope
var result = take({
with: { a, b, times },
eval: 'times(a, b)'
});
console.log('The meaning of life is:', result); //=> 42
}();
// e.g 5
var invoke = scopedRunner((fn, ...args) => fn.apply(null, args))();
void function () {
var result = invoke((a, b) => a + b, 6, 7);
console.log('The meaning of life is:', result); //=> 13
}();