2014-03-04 84 views
0

我對JavaScript非常陌生,因此對於可能微不足道的問題表示歉意?如何訪問JavaScript中的函數內部的變量?

var foo = function() { 
    a = "10"; 
    this.b = "20"; 
}; 

foo.c = "30"; 

console.log(foo.a); // undefined 
console.log(foo.c); // prints 30. 

var foo1 = new foo(); 
console.log(foo1.b) // prints 20 

如何訪問var「a」?它甚至有可能嗎?

+0

你總是可以使用全局變量。 – JCOC611

+0

@ JCOC611如何訪問var「a」?它甚至有可能嗎? – JavaDeveloper

+1

它不是。這是一個私有範圍變量的形式。 –

回答

2

使用全局變量:

var a = 10; 
var foo = function() { 
    a = 15; 
    this.b = 20; 
}; 
console.log(a); // equals 10 
foo(); 
console.log(a); // equals 15 

如果你想在函數中實際訪問的變量a,就像你的例子:

var foo = function() { 
    a = 10; // private member 
}; 

沒有辦法訪問私有成員。

當你用這種方式聲明一個變量時,你創建了一個全局變量。您可以使用console.log(a);訪問它,它將返回10。但是,如果在函數內部使用var a = 10;,則無法訪問此成員。

4

其實,只要你不var前綴的變量聲明,將是全球性的:

var foo = function() { 
    a = "10"; 
    this.b = "20"; 
}; 

foo(); 

console.log(a); // is 10 

相比:

var foo = function() { 
    var a = "10"; // private scope 
    this.b = "20"; 
}; 

foo(); 

console.log(a); // is undefined 
+0

@ 6502:我只是修復了它。 – JCOC611

0

你可以做的是返回一個對象您的構造函數定義了公共成員:

function Foo() { 
    var a = '10'; 

    function getA() { 
     return a; 
    } 

    return { 
     'a': a, 
     'b': 20, 
     'getA': getA 
    }; 
} 

var foo = new Foo(); 
console.log(foo.a) // 10 
console.log(foo.b); // 20 
console.log(foo.getA()); // 10 
0

代碼

console.log(foo.a); 
console.log(foo.c); 

意味着你相信a將被設定爲foo.a = "10"等價,即設置「類」 foo的靜態字段。 JavaScript中不是這種情況。

a = "10"; 

此設置全局變量a爲值"10",創建一個全局變量插槽如果必要的話。應該避免這種類型的全局分配,並被諸如JSLint之類的工具捕獲。

this.b = "20"; 

這設置爲this參數的函數來"20"傳遞的對象的字段,創建磁場槽如果必要的話。請注意,如果您直接撥打foo,例如foo(),沒有new,全球範圍通過爲thisthis.b也會創建一個全局變量。這種類型的錯誤可以通過嚴格模式來捕獲。如果以嚴格模式執行,undefined作爲參數this被傳入,這將引發異常。

var foo1 = new foo(); 

這產生與__proto__屬性設置爲fooprototype屬性的值的新的,空的,對象,然後調用foo傳遞新的對象作爲this參數。__proto__的所有字段都顯示爲對象字段的默認值。這導致了向構造函數的prototype對象添加方法以及在構造函數中初始化字段的慣例。繼承可以通過構造一個對象,該對象的祖先原型對象爲其值爲__proto__的值並將其分配給構造函數的函數prototype屬性。構造函數還會調用祖先構造函數(不帶new),並將其this作爲構造函數的this參數(使用applycall)。這有點尷尬,所以ECMAScript 6將這個標準化爲一個class構造,其大致轉化爲我所描述的。

相關問題