Javascript 从定义调用时函数体中未初始化函数属性

Javascript 从定义调用时函数体中未初始化函数属性,javascript,Javascript,在下面,我尝试使用定义直接调用函数f2,也可以单独调用,并且在这两种情况下都会调用它。但是,仅当单独调用它时,才会初始化f2.str,而不是直接使用定义调用它。有人有解释吗 (function f2() { alert("XXXXXXXXXXXXX"); f2.str = "EEEEEEEEEEEEEE"; }()); //f2(); 当您使用函数表达式时,函数名的作用域是该函数,因此除了在IE的错误版本中,它不会在函数之外定义。请阅读有关Javascript中定义函数

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

(function f2() {

    alert("XXXXXXXXXXXXX");

    f2.str = "EEEEEEEEEEEEEE";

}());

//f2();

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

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

  • 函数名不能更改,而变量名不能更改函数名 已分配给的可以重新分配
  • 只能使用函数名 在函数的主体内。正在尝试在外部使用它 函数体导致错误(如果函数 名称以前是通过var语句声明的)。例如:

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

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

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

  • 如第四个示例所示,函数名可以不同于 函数分配给的变量。他们彼此没有关系 其他的

例如:

(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;//在此范围内声明f2
(f2=函数(){
警报(“XXXXXXXXXXXX”);
f2.str=“eeeeee”;

})(); // 函数f(){alert(f2.str);};复制品?这并不能解释为什么只调用f2()时它会起作用。我正在运行Chrome和FF,顺便说一句。@Mark尝试从您的示例调用
f2()
,您将得到
ReferenceError
@Mark:如果省略
(…())从定义中,您有一个函数声明,它为当前作用域中的函数创建一个符号。如果您有
(…())
,则定义作为函数表达式进行计算,函数表达式的名称始终是函数本身的本地名称。@请标记,当您仅调用
f2
时,它不起作用,除非您使用一个而不是表达式定义了
f2
。事实上,您可以在f2中按名称引用f2,表示该名称存在于该点。你说即使最后调用它,f2仍然不存在。我猜JS就是这么做的,但这似乎是一个错误的特性。
var f2; // Declare f2 in this scope
(f2 = function() {

    alert("XXXXXXXXXXXXX");

    f2.str = "EEEEEEEEEEEEEE";

})(); // <-- Note that the parenthesis have been necessarily reordered