问:+function foo(){
Foo = 10; // My problem code
Console.log(foo);//method itself
}();
Console.log (typeof foo); //undefined to see if global pollution is present
在foo函数中重新分配给foo的10个在哪里?具有相同名称的函数foo如何防止全球污染?
答:受试者可以问这个,是的。但是这个问题可以通过自己的实践解决。
首先,主题与IIFE的编写没有关系。编写IIFE的方法很多。通用这就是@ewind说及:
(function(){}())
也有不寻常的地方:
!function(){ /* code */ }();
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();
然后是代码:
在函数中分配当前函数名称时:foo = 10;无效。(认可@ewind,在这里应该被忽略,应该更合理。)JS解析器将忽略它。
我在Chrome控制台上执行了结果是,
function foo(){
Foo = 10; // My problem code
Console.log(foo);//method itself
}
Undefined // results of typeof foo above
这证明了我上面所说的。忽略。
然后,因为IIFE模拟了块作用域,所以外部环境无法访问内部变量。因此它是未定义的。
Ewind说,因为foo是一个匿名函数,那么会发生什么?
显然,这个概念很混乱。foo函数不是匿名函数。
function [name]([param] [, param] [..., param]) { statements }
name
Function name can be omitted. When the function name is omitted, the function becomes anonymous.
MDN
答:首先,发布的代码不完整。完整版应该像这样
(function foo(){
foo = 10
console.log(foo) // [Function: foo]
})();
console.log(typeof foo) // undefined
这似乎违反直觉,因为没有var声明的foos不会污染全局范围。
但是,如果函数中声明的变量名称不是foo,则很直观,如下所示:
var bar = 1;
(function foo(){
bar = 10
})();
console.log(typeof foo) // undefined
console.log(bar) // 10
那么,为什么在函数中声明的变量与函数名具有相同的名称?您可以看到以下示例:
(function foo(){
console.log(foo) // [Function: foo]
console.log(arguments.callee) // [Function: foo]
console.log(foo === arguments.callee) // true
})();
当使用函数名称foo,参数调用函数时。被调用者实际上是对foo的引用。比较两者,我们可以发现foo是此时的函数对象。此时,分配操作无法生效。当遇到没有var声明的foo变量时,解释器会找到相同的函数对象,因此它不会污染全局范围。
答:(function foo(){
Foo = 10; //我的问题代码
Console.log(foo);//method itself
那是正确的事情。
函数不能以+开头;这将导致JS解析错误