1

在下文中,我尝试使用定义直接调用函数 f2,也可以单独调用,并且在两种情况下都会调用它。但是,只有在单独调用它时才会f2.str初始化,而不是在直接使用定义调用它时。有人有解释吗?

(function f2() {

    alert("XXXXXXXXXXXXX");

    f2.str = "EEEEEEEEEEEEEE";

}());

//f2();
4

1 回答 1

2

当您使用函数表达式时,函数名称的作用域是该函数,因此除了在有缺陷的 IE 版本中之外,它不会在它之外定义。在此处阅读有关在 Javascript 中定义函数的不同方法之间的区别的更多信息:

函数名称和函数分配给的变量之间存在区别:

  • 函数名不能更改,而函数分配给的变量可以重新分配。
  • 函数名只能在函数体中使用。尝试在函数体之外使用它会导致错误(如果函数名先前通过 var 语句声明,则为未定义)。例如:

    var y = 函数 x(){};
    警报(x);// 抛出错误

    当函数通过 Function 的 toString 方法序列化时,函数名称也会出现。

    另一方面,分配给函数的变量仅受其范围的限制,保证包括声明函数的范围。

  • 如第 4 个示例所示,函数名称可以与分配给函数的变量不同。他们彼此没有任何关系。

例子:

(function f2() {

    // f2 is defined here

    alert("XXXXXXXXXXXXX");

    f2.str = "EEEEEEEEEEEEEE";

    // f2.str is defined here

}());

// In buggy versions of IE f2 and f2.str are still defined. 
// In all other browsers they are correctly not defined.



如果您想使用函数表达式并且想要f2存在于它自己的范围之外,那么您可以执行以下任一操作:

var f2 = function() {

    alert("XXXXXXXXXXXXX");

    f2.str = "EEEEEEEEEEEEEE";

};

f2();

或者:

var f2; // Declare f2 in this scope
(f2 = function() {

    alert("XXXXXXXXXXXXX");

    f2.str = "EEEEEEEEEEEEEE";

})(); // <-- Note that the parenthesis have been necessarily reordered
于 2013-06-19T19:09:25.397 回答