TLDR; (func)(params);
就地执行函数,而不必将函数分配给单独的变量。
让我们把这段代码分解成更小的元素。首先,整个代码是一个自执行函数。考虑我们有一个匿名函数。
var add = function (a,b) { return a + b; };
我们可以像这样调用这个函数
add(1,2);
但是我们也可以将我们的函数包装进去()
并以相同的方式调用它。
(add)(1,2);
两者都会导致add
函数被调用。因为 JavaScript 不区分函数字面量和对匿名函数的引用,我们可以使用相同的格式来调用函数字面量。
(function(a,b){ return a + b; }))(1,2);
这是您的代码用来调用外部函数的格式。那么为什么我们要以这种方式调用函数呢?因为命名空间,还是缺少那里的。JavaScript 有一个全局可变的命名空间。全局意味着所有语言结构都可以在默认执行脚本的同一个命名空间中使用。这不会是一个问题,但是这个命名空间中的所有内容都是可变的。所以
Array = {};
将重新定义数组构造函数。如果页面上正在使用的任何其他脚本Array
尚未完成执行,它们将停止工作。这很糟糕,因为它会产生不可预测的行为。那么我们如何解决这个问题。一种方法是将我们的整个程序放在一个函数中。当您在一个封闭的函数中时,您不再位于全局 javascript 命名空间中。您在函数范围内,Array
如果您觉得需要,您可以自由重新定义(虽然不要重新定义数组)。
所以我们有我们的功能来保护我们的程序免受页面内运行的任何其他程序的影响,但是我们有一个问题。我们已经定义了一个函数,但是我们没有调用它。Javascript 在读取时执行。当 VM 读取 js 文件的第一行时,它将执行该行。函数中的代码并非如此。这段代码只会在函数被调用时执行。因此,将简写()
添加到已定义函数的末尾以确保该函数在 VM 加载后立即被调用。