Javascript函数范围

时间:2009-08-12 03:46:49

标签: javascript

这可能是一个愚蠢的问题,但我是Javascript的新手并急需帮助。

如果Javascript引擎会在函数外部查找全局变量,那么将参数传递给它的重点是什么?你有什么收获?

我理解全局变量通常不受欢迎,但我仍然不理解传递变量的目的。它与数据封装有关吗?

7 个答案:

答案 0 :(得分:4)

程序员用它来描述不同类型的函数。这里有几个:

  • 重入
  • ThreadSafe的
  • Referentially Transparent
  • 幂等
  • 副作用

如果你想头疼,你可以看看他们中的一些。关键是计算机科学和工程的进步一直是关于降低复杂性。我们花了很多时间考虑编写函数来实现该目标的最佳方法。希望你可以一次把你的程序的一小部分填入脑中,并理解这些部分,而不必同时了解整个程序的整体功能,或者详细实现所有其他功能的内部。使用全局变量的函数不能很好地执行此操作,因为:

  1. 您无法保证全局变量存在
  2. 您不能保证全局变量是您认为的那样
  3. 您不能保证程序的其他部分没有以您期望的方式修改这些变量。
  4. 您不能轻易地概括在多组变量上多次使用该函数。
  5. 如果没有先设置函数的外部环境及其依赖关系,就无法轻松验证函数是否与广告一样有效。
  6. 如果全局变量以您没想到的方式发生变化,那么很难找到程序的哪个部分是罪魁祸首。它可以是写入该变量的500个不同函数中的任何一个!
  7. 另一方面,如果您明确传入函数需要操作的所有数据,并显式返回所有结果:

    • 如果这些变量出现问题,很容易找到问题的根源
    • 添加代码以验证输入的“域”更容易。它真的是一个字符串吗?它是否超过一定长度,是否在一定长度内?这是一个正数吗?它是完整的还是分数的?你的代码需要正确运行的所有这些假设在函数开始时都是明确的,而不是只是交叉指责并希望没有出错。
    • 如果其输出仅取决于其输入,则更容易猜测特定功能实际会做什么。
    • 函数的参数不依赖于任何外部变量的命名。

    等优点。

答案 1 :(得分:1)

如果你只是要使用函数所使用的全局变量,那么你总是必须知道函数的内部工作方式以及你的全局变量名称必须使它们起作用。

如果使用全局变量,像Math.abs(n)这样的东西很难在一行中调用两次。

答案 2 :(得分:1)

函数是代码的可重用组件,它在提供的变量上执行特定的片段,表现出不同的行为。 封装来自面向对象。函数更多的是为程序提供结构。 此外,如果方法的访问变量存在于上下文中而不是全局变量,则不应破坏方法的执行时间。

答案 3 :(得分:0)

如果你不需要将参数传递给函数,那么你真的不需要函数。

通常(并且应该)使用函数来提供代码重用 - 在不同的变量上使用相同的函数。如果函数访问全局变量,那么每次使用它时它都会执行相同的操作。如果我传递参数,我可以让它在每次使用时执行不同的操作(基于这些不同的参数)。

答案 4 :(得分:0)

其中一个主要好处是它可以保留附近功能所需的所有信息。可以仅查看函数本身并了解其输入是什么,它做什么以及它的输出是什么。如果您使用全局变量而不是将参数传递给函数,则必须查看代码以查找函数运行的数据。

这只是一个的好处,很多,但很容易理解。

答案 5 :(得分:0)

  • 全局变量(使用任何语言)有时会变得陈旧。如果有可能,最好在本地声明,初始化和使用它们。你必须能够信任你正在使用的东西。
  • 同样,如果某事/某人可以更新您的全局变量,那么您必须能够信任您使用它们时会发生什么的结果。
  • 一切并非总是需要全局变量,为什么要让它们闲逛?

也就是说,变量全局变为namesapce可能很有用,特别是如果你使用类似jquery选择器的东西,并且你想为性能而缓存。

答案 6 :(得分:0)

这真的是一个javascript问题吗?我还没有遇到过没有某种形式的全局变量的语言。