4

如果我错了,请发表评论:在我的记忆中,我认为两种函数创建方式之间的区别:

function myFunc(){};

myFunc = function(){};

是第一个立即评估,然后等待函数调用。

所以我在这篇文章中得到了关于全局变量附加到窗口对象的代码:

function setGloabalVariable(){
  window.variable = '1';
}

加载页面后,为什么变量仍然未定义?

4

3 回答 3

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 关于函数表达式和语句的优秀文章,以获取有关此主题的更多信息。

于 2012-08-21T05:54:00.043 回答
0

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 () { }());

关于自执行匿名函数的文章

匿名函数创建了一个本地/内部范围。非常适合创建命名空间,并使事物远离全局命名空间。

于 2012-08-21T05:55:33.483 回答
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

在这两种情况下,您都必须实际调用函数才能执行函数内部的代码。

于 2012-08-21T06:54:53.027 回答