javascript - 从回调和内联自调用函数访问父函数变量

标签 javascript

我相信乍一看这两个自调用函数是相同的,它们之间的唯一区别是在第一个中我传递回调函数然后通过参数对象执行,而在第二个中通过使函数自调用来做同样的事情。现在来访问第一个示例中的父变量名称是“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里面barname有关里面foo ,对吧?


在另一种情况下,

(function foo(){
  var name = "Nishant";
  (function bar(){console.log(name);})()
})();

你定义了bar 内部 foo . name也在foo里面因此 bar可以访问该变量(词法作用域 + 闭包)。

关于javascript - 从回调和内联自调用函数访问父函数变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24103264/

相关文章:

javascript - 如何在 XML 中搜索关键字并向下滚动窗口找到它?

javascript - AJAX 应该使用 hashtag/#!/还是不使用?

javascript - 如何遍历 javascript 行分隔字符串,检查分号分隔的第一个值,并连接值相等的行?

javascript - 我可以在 javascript 中找到函数参数的类名吗?

Javascript GooglMaps API 句柄经常不工作

javascript合并对象数组,生成数组中的对象值

javascript - 如何将对象数组转换为数组数组数组

javascript - 从数组中选择一个随机元素并将其显示在屏幕上

Javascript - 确定对 Element.children 功能的支持

javascript - Vanilla js 等同于 jquery .attr( attributeName, function )