Javascript 使用 newFunction 方法和 eval 技术动态执行代码。
新功能
请看nodejs环境下的Demo:
global.n = 1;
function f(){
var n = 2;
var e = new Function("return n;");
return e;
}
function f2(){
var n = 2;
function e(){
return n;
}
return e;
}
console.log(f()()); // 1
console.log(f2()()); // 2
评估
eval函数的执行过程:
1.搭建新的执行环境。
3、执行环境中的this指向当前执行环境中的this。
3、执行环境中的作用域链指向当前执行环境的作用域链。
4. 正常执行代码。
请看nodejs环境下的Demo:
global.n = 1;
function f2(){
var n = 2;
function e(){
return n;
}
return e;
}
var evaluedFn = eval("("+f2.toString()+")");
var nativeFn = evaluedFn();
console.log(nativeFn()); // 2
实现要求的方法顺序
尹老师的DSL使用指南:
尽一切可能阻止 DSL 的创建,因为它会造成严重的理解、沟通和学习曲线问题typescript 动态加载,从而严重提高团队的生产力。 如果这个DSL被用户使用,将会严重影响用户体验,增加产品的可用性。 大多数DSL需要解决的问题只是“动态逻辑加载”。 为此,您可以完全使用现有的语言(例如JavaScript),或者采取其部分结构并动态调用其类库(编译器)来实现此目标,而无需创建新的DSL。 大多数时候,编写库代码并将所需的功能变成函数肯定可以解决问题。 如果真的到了创建DSL的时候了,并且没有DSL就无法解决问题typescript 动态加载,那么你就可以开始设计DSL了。 但DSL必须由编程语言专家来完成,否则仍然可能给产品和团队带来严重的后果。
参考: