2009-08-12 106 views
1

这也许是一个愚蠢的问题,但我是Javascript的新手,绝望的帮助。Javascript函数范围

如果Javascript引擎会在函数外寻找全局变量,那么传递参数到底有什么意义呢?你有什么收获?

我明白,全局变量通常是皱眉,但我仍然不明白传递变量的目的。它与数据封装有关吗?

+0

您获得理智。您当然可以在不传递参数的情况下创建程序。但最终你会弄得一团糟。 – Nosredna 2009-08-12 04:02:00

回答

4

程序员用一些神奇的词来描述不同类型的函数。这里有几个:

  • 重入
  • ThreadSafe的
  • 引用透明
  • 幂等
  • 副作用

如果你可以看看其中的一些了你想要头痛。关键是计算机科学和工程学的进步始终是降低复杂性。我们花了很多时间考虑编写函数来达到这个目标的最佳方式。希望您可以一次性将您程序的一小部分内容放入脑中,并理解这些部分,而不必同时理解整个程序的整体功能,或者详细实现所有其他功能的内部功能。使用全局变量不能做到这一点很好的函数,因为:

  1. 不能保证全局变量存在
  2. 不能保证全局变量是什么,你认为他们是
  3. 你不能保证程序的其他部分没有以你没有想到的方式修改这些变量。
  4. 您不能轻易概括地在多组变量上多次使用该函数。
  5. 如果不先设置函数的外部环境及其依赖关系,则无法轻易验证该函数是否按照公布的方式工作。
  6. 如果全局变量以您没有预料到的方式发生变化,那么确定程序的哪一部分是罪魁祸首真的很难。它可以是写入该变量的500个不同函数中的任何一个!

在另一方面,如果你明确地传递所有的功能需要操作的数据,并明确地返回所有的结果:如果出现问题与任何这些变量的

  • ,很容易找到问题的根源
  • 添加代码以验证输入的“域”更加容易。它真的是一个字符串吗?它是否超过一定的长度,是否在一定的长度?这是一个正数吗?是整体还是分数?所有这些代码需要正确操作的假设可以在函数的开始处明确,而不是仅仅交叉手指,并且希望没有任何问题。
  • 如果特定函数的输出仅依赖于其输入,那么猜测特定函数实际上会做什么更容易。
  • 函数的参数不依赖于任何外部变量的命名。

等优点。

0

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

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

+3

第一条语句不是真的,如果你不需要参数仍然有用于函数,将代码分解成块使得它更容易理解 – 2009-08-12 03:54:01

+0

你可以编写大量有用的不带参数的JavaScript函数。 – tribus 2009-08-12 03:57:18

+0

同意,但不是*必须的*(这就是为什么我使用这个词的原因)。 – Nicole 2009-08-12 20:55:03

0

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

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

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

也就是说,变量global到namesapce可能是有用的,特别是如果您使用类似jquery选择器的东西,并且想要缓存性能。

1

如果您只打算使用函数所处理的全局变量,那么您将始终需要知道函数的内部工作方式以及您的全局变量名称对于他们的工作原理。

此外,如果使用全局变量,则类似于Math.abs(n)将很难在一行中调用两次。

0

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

+0

纠正我,如果我错了,但只有Javascript函数会寻找超出它的正常范围的变量,明确标记为全局? – 2009-08-12 04:00:54

+0

哦,不,它不是JavaScript独有的。 – Nosredna 2009-08-12 04:17:59

+0

我不认为haskell或Java有全局变量。 – Breton 2009-08-12 05:03:10

1

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