以下代码:
(function() {
var hello = function(name) {
alert('Hello, ' + name);
}
hello('New user');
})();
带有ADVANCED_OPTIMIZATIONS
的编译为:
alert("Hello, New user");
但是这段代码:
(function() {
var hello = function(name) {
alert('Hello, ' + name);
}
hello.a = 5;
hello('New user');
})();
编译为:
function a(b){alert("Hello, "+b)}a.a=5;a("New user");
为什么它不能忽略hello.a = 5
?
(不能在上下文之外使用,没有eval
,没有[]
和new Function()
。)
答案 0 :(得分:2)
为了使其工作,编译器需要确定没有人用查看调用函数的函数替换“alert”:
alert = function() {
console.log(arguments.callee.caller.a);
}
但是“alert”是一个外部函数,所以无法确定它实际上做了什么。一般来说,javascript是如此可变,以至于可以安全地从函数中删除属性的情况非常罕见,因此找不到它们是值得的。
通常,Closure Compiler可以删除属性,这是作弊。这里有一些讨论:
https://github.com/google/closure-compiler/wiki/Understanding-Property-Removal
答案 1 :(得分:0)
您可以通过在内置函数周围编写包装器来帮助编译器优化这些:
function myalert(name){alert('Hello, ' + name)}
(function() {
var hello = function(name) {
myalert(name);
}
hello.a = 5;
hello('New user');
})();
产地:
alert("Hello, New user");
当您将常用的事物(如document.createElement()
)用于混淆和缩小范围(未压缩时)时,这也很有用。