首先 - 是的,我知道有很多关于这个的帖子,或者至少非常相似的帖子。看过那些我还没有找到我正在寻找的答案:
我了解到有两种主要方法可以在javascript中创建函数:
var test = function(a){
console.log(a);
}
这是在运行时创建的,并且:
function test(a){
console.log(a);
}
在运行时之前创建。
今天我看到了这个:
(function test(a){
console.log(a);
})();
我以前从未见过。这个与上面两个区别的是什么?
答案 0 :(得分:3)
这是立即调用函数,它会在声明后立即自行调用。
您可以在维基百科上阅读有关Immediately-invoked function expression的更多信息。
答案 1 :(得分:2)
它们之间的区别在于前两个只定义了函数,而最后一个定义并执行了函数。最后一个的典型用途是减少全局名称空间污染,因为变量将作用于函数而不是窗口。
答案 2 :(得分:2)
您的函数示例将在Javascript中考虑如下:
你称之为“运行时”的事情是两件事。 Javascript引擎对您的代码进行两次传递。第一遍可以称为声明传递,其中标识变量和函数声明。然而,一个有趣的事情发生在第一遍中的变量,他们被称为“悬挂”但未初始化。第二遍是执行传递。这些是我认为你称之为“运行时”的两件事。
第一个函数将发生的变化是与变量相同的行为,因为变量被分配给变量,它将被“提升”到函数上下文的顶部并声明但未初始化。所以JS会知道它的一个变量,但它被识别为未定义,直到它到达代码段'oh'将该变量初始化为函数。所以你必须等到初始化步骤之后才能使用。
/* This is how function expression looks after
first pass identified but not assigned(initialized) to function
its hoisted and undefined just like a reg variable. */
var test;
//test is undefined here
console.log(test);
//test is initialize here
var test = function (a) {
console.log(a);
}
//test is recognized as a function here
console.log(test);
第二个函数将在第一遍中被声明(标识)为函数,你可以使用它,因为JS知道这个函数是一个函数。
//this is recognized as function
console.log(test);
function test (a) {
console.log(a);
}
//test is recognized as function here as well
console.log(test);
第三个函数将在第一次传递中声明后立即执行,并创建自己的执行上下文,包含自身。
//test is not recognized here
console.log(test);
(function test(a) {
console.log(a);
//surprise test is recognized here
console.log(test);
})();
//test is not recognized here
console.log(test);
您还有匿名函数和命名函数表达式。函数在JS中非常强大。快乐编码!!