我相信乍一看这两个自调用函数是相同的,它们之间的唯一区别是在第一个函数中我传递回调函数,然后通过参数对象执行,而在第二个函数中通过使函数自调用来做同样的事情。现在来访问第一个示例中的父变量,名称是“undefined
“而在第二个示例中,它是可访问的并给出输出”Nishant
“我不明白它是如何工作的!
(function(){
var name = "Nishant";
arguments[0]();
})(function(){console.log(name);});
输出:(空字符串)
(function(){
var name = "Nishant";
(function(){console.log(name);})()
})();
输出:尼尚特
我无法弄清楚它是如何工作的!
JavaScript 有lexical scope。这意味着范围由源代码中定义函数的位置决定(与动态范围,其中范围是在运行时调用函数时确定的)。
让我们为您的函数添加一些名称,以便我们可以更轻松地引用它们:
(function foo(){
var name = "Nishant";
arguments[0]();
})(function bar(){console.log(name);});
在这种情况下bar
被定义为outside of foo
因此无法访问内部定义的变量foo
。事实上,此刻bar
创建后,变量name
inside foo
甚至还不存在,因为foo
尚未被执行。
当您不内联定义时,也许更容易看到:
function bar(){console.log(name);}
(function foo(){
var name = "Nishant";
arguments[0]();
})(bar);
这可能看起来更熟悉,我打赌你不会想到这一点name
inside bar
有什么关系name
inside foo
, right?
在另一种情况下,
(function foo(){
var name = "Nishant";
(function bar(){console.log(name);})()
})();
你定义了bar
inside of foo
. name
也在里面foo
因此bar
可以访问该变量(词法作用域+闭包)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)