在下文中,我尝试使用定义直接调用函数 f2,也可以单独调用,并且在两种情况下都会调用它。但是,只有在单独调用它时才会f2.str
初始化,而不是在直接使用定义调用它时。有人有解释吗?
(function f2() {
alert("XXXXXXXXXXXXX");
f2.str = "EEEEEEEEEEEEEE";
}());
//f2();
在下文中,我尝试使用定义直接调用函数 f2,也可以单独调用,并且在两种情况下都会调用它。但是,只有在单独调用它时才会f2.str
初始化,而不是在直接使用定义调用它时。有人有解释吗?
(function f2() {
alert("XXXXXXXXXXXXX");
f2.str = "EEEEEEEEEEEEEE";
}());
//f2();
当您使用函数表达式时,函数名称的作用域是该函数,因此除了在有缺陷的 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