在下文中,我尝试直接使用定义调用函数f2,也单独调用函数f2,并在两种情况下调用它。但是,只有在单独调用它时才会初始化f2.str
,而不是直接使用定义调用它。有人有解释吗?
(function f2() {
alert("XXXXXXXXXXXXX");
f2.str = "EEEEEEEEEEEEEE";
}());
//f2();
答案 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