我相信乍一看这两个自调用函数是相同的,它们之间的唯一区别是在第一个中我传递回调函数然后通过参数对象执行,而在第二个中通过使函数自调用来做同样的事情。现在来访问第一个示例中的父变量名称是“undefined
”,而在第二个示例中它是可访问的并给出输出“Nishant
”我无法理解了解它是如何工作的!!
(function(){
var name = "Nishant";
arguments[0]();
})(function(){console.log(name);});
输出:(空字符串)
(function(){
var name = "Nishant";
(function(){console.log(name);})()
})();
输出:Nishant
最佳答案
I am not able to figure out how It's working!!
JavaScript 有 lexical scope .这意味着作用域由函数在源代码中定义的位置决定(与动态作用域不同,后者的作用域是在运行时调用函数时确定的)。
让我们为您的函数添加一些名称,以便我们可以更轻松地引用它们:
(function foo(){
var name = "Nishant";
arguments[0]();
})(function bar(){console.log(name);});
在这种情况下 bar
定义在 foo
的之外因此无法访问 foo
中定义的变量.事实上,此刻bar
创建后,变量 name
里面foo
甚至还不存在,因为foo
还没有执行。
也许当你不内联定义时更容易看到:
function bar(){console.log(name);}
(function foo(){
var name = "Nishant";
arguments[0]();
})(bar);
这看起来可能更熟悉,我打赌你不会想到 name
里面bar
与name
有关里面foo
,对吧?
在另一种情况下,
(function foo(){
var name = "Nishant";
(function bar(){console.log(name);})()
})();
你定义了bar
内部 foo
. name
也在foo
里面因此 bar
可以访问该变量(词法作用域 + 闭包)。
关于javascript - 从回调和内联自调用函数访问父函数变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24103264/