如果我错了,请发表评论:在我的记忆中,我认为两种功能创造方式之间存在差异:
function myFunc(){};
和
myFunc = function(){};
是第一个立即评估,后者等待函数调用。
所以我在this article中得到了关于全局变量附加到window对象的代码:
function setGloabalVariable(){
window.variable = '1';
}
加载页面后,为什么变量仍未定义?
答案 0 :(得分:3)
这两种声明之间的区别在于第一种是命名的函数语句,第二种是匿名函数表达。 它们都不会在声明时自动执行(您可能会想到IIFE)。
// Create a symbol named "my_named_function"
// that points at the named function "my_named_function"
function my_named_function() {
}
// Create a symbol named "my_anonymous_func"
// that points to the *unnamed* function <anonymous function>
var my_anonymous_func = function() {
}
my_named_function
和my_anonymous_func
都未执行。 可以通过调用它们来执行:
my_named_function();
my_anonymous_func();
IIFE(立即执行的函数表达式)的工作方式略有不同:
(/* define a function */ function() {
})(/* and *immediately* execute it */);
我建议您阅读kangax's excellent article on function expressions and statements,了解有关此主题的更多信息。
答案 1 :(得分:0)
function myFunc(){}
是一个全局函数文字,它不会立即“运行”,但它可以是 forward&amp;向后引用。含义:
myFunc(); // this will run
function myFunc(){}
如:
myFunc(); // this will **not** run
myFunc = function (){}
与第二个函数的区别在于,即使您没有在那里声明var myFunc =
。它变成一个全局变量(也称为内联匿名函数),与全局内联函数不同,因为它必须高于sometihng(向后引用)才能被使用。
function setGloabalVariable(){
window.variable = '1';
// this could have been written
// variable = '1'; var variable = '1';
// unless this function is called in some global scope, the closure won't
// bring out this variable
}
一个匿名函数立即运行,我认为这就是你的想法(但你的OP中没有)。
(function () { }());
Article on self-executing anonymous functions
匿名函数创建了本地/内部范围。非常适合创建名称空间,并远离全局名称空间。
答案 2 :(得分:0)
命名函数在编译时创建并分配,因此它在代码开始运行之前存在。例如:
x(); // This works, as the function below already exists
function x() {}
可以在编译时创建匿名函数(取决于实现),但是在运行时将值赋给变量。例如:
x(); // This doesn't work, as the value is not assigned yet
x = function(){};
x(); // Here it works
在这两种情况下,你必须实际调用函数来执行要执行的函数内的代码。