+function foo(){
foo=10;//我的问题代码
console.log(foo);//方法自己
}();
console.log(typeof foo);//undefined 观察是否全局污染
Ich würde gerne fragen, wo die 10, die foo innerhalb der Funktion foo zugewiesen wird, hingehört und wie die Funktion foo mit demselben Namen die globale Verschmutzung verhindert. Bitte lösen und erweitern Sie sie
题主能问这个,可以的.不过这题能通过自己实践解决掉...
首先题主对于IIFE的写法没问题,IIFE的写法好多,常见的就是@ewind说的这个和:
还有不常见的:
然后再说代码:
在函数里给当前函数名赋值时:
foo = 10;
无效.(赞同@ewind,这里会忽略,应该有更合理的说法.)JS解析器会忽略掉它.我在Chrome控制台执行的结果是:
这就证明了上面我说的忽略.
然后因为IIFE模拟了块作用域,外部环境访问不了内部的变量.所以就是undefined.
@ewind说因为foo是匿名函数然后怎样怎样.
明显概念搞混了.foo函数并不是匿名函数.
MDN
首先,贴出的代码是不完整的。完整版应该是这样
这确实看起来比较反直觉,因为没有采用 var 声明的 foo 并没有污染全局作用域。
但如果函数内声明的变量名不是 foo,就很符合直觉了,如下:
所以为什么函数内声明的变量和函数名同名时,会发生问题呢?可以看这个示例:
在立即执行的函数带有 foo 这一函数名后,调用时的 arguments.callee 其实就是对 foo 的引用了。比较二者可以发现此时 foo 就是函数对象。此时赋值操作并不能生效,遇到未加 var 声明的 foo 变量时,解释器查找到的也是这个函数对象,从而不会在全局作用域下产生污染。