您需要调用Init 来运行其中的任何代码。现在,里面的代码只是普通的 JavaScript 代码,但很有趣。让我们看看为什么。
如何
你的内部函数是所谓的IIFE。为了更容易阅读外部函数 (Init),您可以做的是将内部函数替换为 IIFE 调用的结果。
这里有几个例子:
var x = undefined; // x === undefined
x = (undefined); // again
x = 3; // x === 3
x = (3); // again the same
x = 'some string'; // some string
x = ('some string'); // the same
所以可以将() 放在一个对象周围,你会得到相同的对象。函数也一样
x = function() {}; // x is that function now.
x = (function() {}); // the same.
但是如果你说x = 3;,你能打电话给x吗?
x = 3;
x(); // syntax error
x = (3);
x(); // again error. can't call a number.
但是,如果你的 x 是一个函数,你可以调用它:
x = function() { console.log('Hi'); }; // you can call x now.
x(); // logs 'Hi'!
所以如果你对括号做同样的事情,它是一样的:
x = (function() { console.log('Hi'); }); // again, the same.
x(); // no error, function called again!
所以你可以跳过作业部分:
// instead of x = (...); and the x(), you replace the x part right away.
(function() { console.log('Hi'); })()
// function body up to here ^^ now the call part.
请注意,如果没有第一对括号,它将无法工作:
function() { console.log('Hi'); }(); // syntax error.
因此,您放置外部括号 () 只是为了将该函数表达式就地转换为对象。
为什么
这就是它的工作原理。 但是为什么呢?因为你想确保没有其他人调用你的函数!如果你这样做:
var x = function() {};
x();
现在至少有两件事可能会发生而您可能不希望发生:
可能存在名称冲突。您可能不知道是否已经在要调用外部函数的位置定义了“x”,例如你bind 初始化某个在范围内有 x 的对象。
有人可以“窃取”你的 x 并再次调用它。不一定要窃取,你只是泄漏它(一个微妙的错误)和其他一些代码调用 x,期望找到它自己的 x,但实际上,它现在是你的 x,因为它是可访问的。而你不希望这样。
因此,您可以轻松地将其锁定在立即执行的匿名函数中。
希望这能让事情变得更清楚。