2009-08-12 179 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

函數是您的代碼的可重用組件,它在提供的變量上執行一個特定代碼段,展現出不同的行爲。 封裝來自面向對象。函數更多的是爲你的程序提供結構。 另外,如果訪問的變量存在於上下文中而不是全局,則不應損害方法的執行時間。