TEL:400-8793-956
当前位置:开发工具

关于在指定的IIFE中重新分配功能的问题?

提问者: 近期获赞: 浏览人数: 发布时间:2020-12-09 10:25:56

问:+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解析错误
上一篇: 快捷方式的Eclipse实现界面是什么?
下一篇: Visual Studio无法使用MacType呈现字体?