如果我错了,请发表评论:在我的记忆中,我认为两种函数创建方式之间的区别:
function myFunc(){};
和
myFunc = function(){};
是第一个立即评估,然后等待函数调用。
所以我在这篇文章中得到了关于全局变量附加到窗口对象的代码:
function setGloabalVariable(){
window.variable = '1';
}
加载页面后,为什么变量仍然未定义?
如果我错了,请发表评论:在我的记忆中,我认为两种函数创建方式之间的区别:
function myFunc(){};
和
myFunc = function(){};
是第一个立即评估,然后等待函数调用。
所以我在这篇文章中得到了关于全局变量附加到窗口对象的代码:
function setGloabalVariable(){
window.variable = '1';
}
加载页面后,为什么变量仍然未定义?
这两种声明的区别在于第一种是命名函数语句,第二种是匿名函数表达式。 它们都不会在声明时自动执行(您可能正在考虑 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 关于函数表达式和语句的优秀文章,以获取有关此主题的更多信息。
function myFunc(){}
是一个全局函数文字,它不会立即“运行”,但可以向前和向后引用。意义:
myFunc(); // this will run
function myFunc(){}
如:
myFunc(); // this will **not** run
myFunc = function (){}
与第二个函数的不同之处在于,即使您没有在此处声明 a var myFunc =
。它成为一个全局变量(也称为内联匿名函数),与全局内联函数不同,它必须高于某个(向后引用)才能使用。
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 () { }());
匿名函数创建了一个本地/内部范围。非常适合创建命名空间,并使事物远离全局命名空间。
命名函数是在编译时创建和赋值的,所以它在代码开始运行之前就已经存在。例子:
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
在这两种情况下,您都必须实际调用函数才能执行函数内部的代码。