2013-02-05 16 views
3

如果函數有範圍,應在該範圍內執行的,但在這裏,我認爲這是不同的看到代碼:JavaScript中的函數是否有作用域?

function foo() { 
    var privateVal = "Private Val"; 
    this.publicVal = "Public Val"; 

    var privateAlert = function (str) { 
     alert(str + this.publicVal); 
     alert(str + privateVal); 
    } 

    this.Run = function() //see here 
    { 
     privateAlert("Private Call: "); 

     this.publicAlert = privateAlert; 
     this.publicAlert("Public Call: "); 

     privateAlert = this.publicAlert; 
     privateAlert("Private Call: "); 
     this.publicAlert("Public Call: "); 
    } 
} 

var bar = new foo(); 
bar.Run(); 

當創建新的對象,Run()成爲一個對象或公共方法方法只能屬於變種bar。該方法不應該能夠在其中執行privateAlert()函數;因爲函數具有範圍,所以它只能從已經聲明的函數中執行,但是這個函數已經失去了它創建的範圍,並且它仍然被執行。請澄清這一點?

+2

我甚至不明白*你怎麼會感到困惑,所以指出你的錯誤並不容易。 –

+9

聽起來像你對關閉感到困惑 - https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures –

+2

在javascript中沒有「私人方法」這樣的東西。如果它的屬性(可調用)在對象上,它可以由任何代碼運行。 「私人」的唯一方法是通過關閉來實現,這是你使用「privateAlert」功能完成的。 「運行」相當於C#/ Java中的公共函數,並且會被認爲類似於「類成員」。公共成員的確可以用更高級的語言來調用私有函數,所以爲什麼不在這裏呢?不過,正如@dystroy所說,不要將javascript函數混淆爲真正的OOP方法 –

回答

6

的簡單的解釋:

  1. 函數內聲明的任何變量不是函數外部訪問。
  2. 內部函數可以訪問在其外部範圍聲明的變量(請參閱closures)。

所以,你可以因爲這兩個一直是foo內部定義從Run調用privateAlert

還有一件事:Run不是bar的私有方法,這是一種公共方法。

相關問題