应该在Javascript中立即评估myFunc = function(){}吗?

时间:2012-08-21 05:51:05

标签: javascript

如果我错了,请发表评论:在我的记忆中,我认为两种功能创造方式之间存在差异:

function myFunc(){};

myFunc = function(){};

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

所以我在this article中得到了关于全局变量附加到window对象的代码:

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

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

3 个答案:

答案 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_functionmy_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

在这两种情况下,你必须实际调用函数来执行要执行的函数内的代码。