2

以下代码:

(function() {
 var hello = function(name) {
  alert('Hello, ' + name);
 }
 hello('New user');
})();

withADVANCED_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, no[]和 no new Function()。)

4

2 回答 2

2

为此,编译器需要确定没有人将“alert”替换为查看调用函数的函数:

alert = function() {
  console.log(arguments.callee.caller.a);
}

但是“警报”是一个外部功能,因此无法确定它的实际作用。一般来说,javascript 是如此的可变,以至于可以从函数中安全地删除属性的情况非常罕见,以至于不值得努力去寻找它们。

通常,闭包编译器可以删除属性的地方是作弊。这里有一些讨论:

https://github.com/google/closure-compiler/wiki/Understanding-Property-Removal

于 2013-05-14T18:39:47.290 回答
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()混淆和缩小(未压缩时)。

于 2016-03-02T15:47:50.607 回答