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

时间:2013-06-19 19:03:47

标签: javascript

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

(function f2() {

    alert("XXXXXXXXXXXXX");

    f2.str = "EEEEEEEEEEEEEE";

}());

//f2();

1 个答案:

答案 0 :(得分:2)

当您使用函数表达式时,函数名称的范围限定为该函数,因此除了IE的错误版本之外,它不在其外部定义。阅读更多关于在Javascript here中定义函数的不同方法之间的差异:

  

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

     
      
  • 函数名称不能更改,而变量函数   分配给可以重新分配。
  •   
  • 只能使用功能名称   在函数体内。试图在外面使用它   函数的主体导致错误(或者如果函数未定义)   name先前是通过var语句声明的。例如:

         

    var y = function 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