gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:42:01 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com