javascript - 通过作为参数传递和全局变量访问函数内部变量之间的区别?

标签 javascript variables parameters arguments closures

通过 as 参数和不带参数访问函数内部的变量有什么区别?

var a = 1;
var b = 2;

function x() {
    var c = a + b;
    console.log(c)
}

function y(a, b) {
    var c = a + b;
    console.log(c)
}

最佳答案

这里的关键区别在于 y不使用提供给函数的参数以外的任何东西。只要你看到函数调用 - 比如说 y(1, 2) - 你确切地知道会发生什么。 (至少假设您相当熟悉该功能及其作用 - 但即使您不熟悉它,希望它有一个足够清晰的名称。)

x 的对比是从外部(这里是全局)变量中读取的ab .换句话说,它依赖于未明确提供给函数的输入。这使得理解对 x() 的调用变得更加困难。可以,因为它取决于 a 的值和 b - 它可能在程序中被分配相当远的距离。事实上,也许它们的值可以通过不同的方式和通过其他函数来改变——在这种情况下,不可能确切地知道 x() 是什么。直到那次电话 session 之前,都不需要仔细研究整个程序。同样,将其与 y 进行对比。我们只需要查看调用站点,无需其他任何内容。

然而,在某些实际情况下,很难避免某种“全局状态”,尽可能避免它,并尝试将函数所需的信息保留在其本地——如 y - 毫无疑问是更好的设计。它使代码更容易理解,因此不太可能出现错误。

关于javascript - 通过作为参数传递和全局变量访问函数内部变量之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52300038/

相关文章:

arrays - SAS如何使用ARRAY更改变量(列)位置(值也)

javascript - 如何获取用户的输入并将其存储以用于 Javascript 函数?

powershell脚本从txt中读取参数

javascript - 复选框无法在 html 页面中显示

javascript - Select2 Ajax 方法不选择

javascript - 如何在 ASP.NET MVC 4 中为 CSP 使用动态随机数

Javascript,检查数组和周围的节点

perl - 使用eval初始化Perl变量

c - 如何更改作为参数传递给函数的变量?

c# - 如何在 C# .NET 中反射(reflect)泛型类型参数