Javascript 闭包编译器:它如何决定何时内联?
我试图让闭包编译器以简单模式内联一些封装在配置对象中的代码,而不需要任何类型注释。并设法降低了包裹的大小 我观察到以下情况: a、 js 编译时返回 a、 min.jsJavascript 闭包编译器:它如何决定何时内联?,javascript,google-closure-compiler,Javascript,Google Closure Compiler,我试图让闭包编译器以简单模式内联一些封装在配置对象中的代码,而不需要任何类型注释。并设法降低了包裹的大小 我观察到以下情况: a、 js 编译时返回 a、 min.js (function() { (function(a) { a = a.log; a("jere"); })({ log: function(a) { console.log(a); } }); })(); 以及 b、 js 编译时 b、 min.js (function(
(function() {
(function(a) {
a = a.log;
a("jere");
})({
log: function(a) {
console.log(a);
}
});
})();
以及
b、 js
编译时
b、 min.js
(function() {
console.log("here");
})();
另一方面,
function main(){
const config = {
log: function log(m) {
console.log(m);
}
};
const log = config.log;
log('m');
log('m');
log('m');
log('m');
}
main()
给予
闭包编译器是如何内联的?是否有明确的方法将其用于内联包装函数
更新:
,我使用了--假设函数包装器,它可以更好地内联代码。但如果函数返回值,CC无法内联
(function main() {
const config = {
log(m) {
console.log(m);
}
}
function reconciler(c) {
const log = c.log;
log('jere');
return {
foo() {
// More side effects
}
}
}
reconciler(config);
}())
没有一个答案。编译器使用启发式和副作用计算来决定何时内联。与嵌套作用域相比,编译器在全局作用域中内联的可能性更小 这些启发法是什么?有没有什么技巧可以让编译器闭包并内联它来编写代码?React团队成功地做到了这一点,我正在做类似的工作[这里]()编译器可以做什么和不能做什么内联的最佳参考是测试用例-有很多:
function main(){
const config = {
log: function log(m) {
console.log(m);
}
};
const log = config.log;
log('m');
log('m');
log('m');
log('m');
}
main()
function main() {
console.log("m");
console.log("m");
console.log("m");
console.log("m");
}
main();
(function main() {
const config = {
log(m) {
console.log(m);
}
}
function reconciler(c) {
const log = c.log;
log('jere');
return {
foo() {
// More side effects
}
}
}
reconciler(config);
}())