网上查找这个会发现一些文章,源头不清楚,内容都是 使用正则表达式替换变量的思路。
比如:https://www.jb51.net/article/100960.htm
由于不是语法分析,所内部的以字符串也会被替换。同时,如果有同名的内部变量,作用域也会改变。
这里使用一种新的思路来进行替代。代码使用ES6的特性,ES5 也可以参照同样的思路写一个转换函数。
思路如下:
比如:一个简单的函数
var data = {a:1, b:2}
function test(data){
with(data) { console.log(a, b);}
}
test();
输出: 1 2
如果去掉 with, 实际上function 变成了
var data = {a:1, b:2}
function test(data){
var a = data.a, b=data.b;
console.log(a, b);
}
要将函数的本体进行转换,使用ES6 的 变量的解构赋值 特性,可以这样做:
var data = {a: 1, b:2};
var args = Object.keys(data); //枚举key
var a = `
console.log(data);
var { ${args} } = $data;
console.log(a, b);
a=3;b=4;
Object.assign(data, { ${args} });
console.log(data)`; //函数体的字符串
var f = new Function("$data", a); //创建函数
f(data); 执行函数
实际使用中,还要加上 try/finally。
一般结构是:
var { 变量} = 参数;
try{ ......}
finally {
Object.assign(对象参数, {变量})
}