我一直在使用javascript一段时间,并开始意识到我使用该语言有多糟糕。它的一些更高级的方面是关闭,如闭包,模块模式等。
有人可以解释放置在函数末尾的()运算符是如何工作的,也就是为什么它会立即调用它 - 我之前没有看过这个,并且对这实际上是如何工作感到困惑。
如:
var myFunct = function() {
alert("here");
}();
最后的()将立即调用该函数。
答案 0 :(得分:5)
函数是一个对象。使用function_name
指的是实际的函数对象。并且function_name()
指的是函数的结果。例如:
function foo() {
return 2;
}
typeof foo()
= "number"
typeof foo
= "function"
答案 1 :(得分:4)
Javascript函数是一流的对象。它们可以存储,传递和返回。由于它们是功能,它们也可以被称为。
所以你可以这样写:
var f = function(message) {
window.alert(message);
}
f("Hello, world!");
创建一个匿名函数对象并将其存储到f
中。然后它通过f()
调用它。
您还可以创建一个匿名函数对象并立即调用它,而不将其存储在变量中:
(function(message) {
window.alert(message);
})("Hello, world!");
答案 2 :(得分:3)
()构造意味着“函数调用”。关于JavaScript的一些与其他语言不同的是标识符不是你可以作为函数调用的唯一东西。所以从C来看,这样的事情可能看起来很熟悉:
fnName();
但是在JavaScript中,任何表达式都可以评估到一个函数,这意味着它可以被称为函数调用。像这样:
(function () {/*do something*/})();
函数表达式周围的括号是分组表达式所必需的,这样第二组括号就是对第一组括号中表达式的函数调用。
答案 3 :(得分:3)
这只是调用函数的语法:
function foo() { alert('Purple is a nice colour') }
foo(); // Invokes the 'foo' function
同样,因为在Javascript函数中是第一类对象,可以这样做:
var foo = function() { alert('I like camels') };
foo(); // Invokes the function that the variable 'foo' has a reference to
这甚至可以在不使用中间变量的情况下表达(因为函数是一个对象):
(function () { alert('Ponies are cool') })(); // Creates a function object, then invokes it
答案 4 :(得分:2)
在JavaScript中,函数也是对象,通过对它应用()运算符,您将调用该函数,并且调用将计算为从函数返回的结果。
因此,让我们分解你的陈述,即:
var myFunct = function() {
alert("here");
}();
首先,你定义一个函数,所以让我们“重构”这个部分,使部分变得更清晰。
var myFunctionDeclaration = function() {
alert("here");
};
var myFunct = myFunctionDeclaration();
现在,您应该更容易看到您在代码中调用该函数。
函数声明不是需要自己的语句,而是可以用作返回函数对象的表达式。
基本上你的代码是这样的:
var myFunct = (expression that produces function object)();
^^
+--- invoke the function
这意味着您可以将它们链接在一起。如果你的函数返回另一个函数,你也可以在同一个语句中调用这个新函数。
例如:
var myFunct = function() {
alert("here");
return function() {
return 10;
};
}()();
^ ^
| +-- calls the inner function, that was returned when calling the outer
| function
|
+---- calls the outer function, which returns a new function object
// myFunct ends up being 10
答案 5 :(得分:1)
如果()没有调用该函数,则必须使用其他语法。它只是函数调用的语法选择,因为它熟悉许多早期语言。参数(如果有的话)放在括号中。
很难看到你如何在没有遇到函数调用的情况下在Javascript中做任何事情。
答案 6 :(得分:0)
我认为你的意思是一个立即执行的无效函数(根据你的编辑,我的假设是正确的):
(function(){...})();
它适用于引用函数的任何值,例如:
var x = function(){};
x();
function y(){}
var z = y;
z();
甚至是一个返回函数引用的函数:
function a() {
return function(){};
}
a()();