我有一个应用程序,在调试模式下写入许多单独的javascript文件,但作为页面头块的一部分同步加载。在发布中,我将所有这些文件合并在一起并将它们缩小。今天我一直在缩小版本中找到错误,所以我加载了一个合并文件来调试问题,发现一个库是自动执行一个函数,它导致window
上定义的其他函数被执行。
我已经使用通用对象回复了此处的行为,无论窗口与否都无关紧要:
<head>
<script>
var a = {}
a.X = function x(){
console.log("shouldn't be executed");
}
(function(a){
console.log("self execution");
}(a));
</script>
</head>
在这个例子中,我得到了
的输出self execution
shouldn't be executed
如果我将通话更改为
<head>
<script>
var a = {}
function x(){
console.log("shouldn't be executed");
}
a.X = x;
(function(a){
console.log("self execution");
}(a));
</script>
</head>
然后我得到了
self execution
这是我的预期。在第一个例子中,当X
传递给自执行函数时,为什么会调用a
?
答案 0 :(得分:22)
将功能分配给;
后,您错过了a.X
。
分号插入是不触发。
匿名函数周围的(
和)
用于调用上一个函数,其返回值分配给X
。
即。你所拥有的相当于:
var a = {};
a.X = (function x(){
console.log("shouldn't be executed");
}(
(function(a){
console.log("self execution");
}(a))
));
顺便说一句,这个问题对于JS Lint来说是一个很好的广告,可以选择它。
答案 1 :(得分:3)
它与分号注入有关,因为当我使用分号时,它按预期工作:
var a = {}
a.X = function x(){
console.log("shouldn't be executed");
}; // added semicolon
(function(a){
console.log("self execution");
}(a));
答案 2 :(得分:1)
您在;
a.X = function x() { ...} ;
<强>即强>
a.X = function x(){
console.log("shouldn't be executed");
};