我自己也试过,我想这是某种闭包捕获,但我看不出其中的区别:
(function() {
var tvLib = {}
window.tvLib = tvLib
})();
从jQuery的方式:
(function(window, undefined) {
var jq;
window.jq = jq;
})(window);
我很困惑,如果我可以调用它,为什么我需要发送窗口对象。
一个原因是让minifiers重命名变量,使其更加紧凑。
这是为了缩小/损毁。
篡改包括将作用域变量重命名为较短的名称,以获得一些字符并混淆代码。例如,作用域变量myVariable
的每次出现都可以被篡改为a
,以便在每次出现在代码中时获得9
个字符。
window
和undefined
都是全局变量,它们不能被破坏,因为这显然会破坏代码。但是,如果将作用域变量分配给它们的值/引用,则这些变量可能会被破坏。如果您的库(如jQuery)使用了大量window
或undefined
,则此技术有助于进一步减小代码大小。
举个例子:
(function(window, undefined) {
var jq;
window.jq = jq;
})(window);
会给出这样的损坏:
(function(a, b) {
var c;
a.c = c;
})(window);
顺便说一句,当您想要导出全局变量时,使用类似数组的语法是很重要的,以避免它们被破坏。因此,您可以安全地从外部引用它们。
这在你的例子中会更好:
(function(window, undefined) {
var jq;
window['jq'] = jq;
})(window);
会给出这样的损坏:
(function(a, b) {
var c;
a['jq'] = c;
})(window);