2013-07-12 13 views
1

我寫這樣的程序:的Javascript使用嵌套用作對象訪問

function a(x,y,z) { 
     function b(foo,bar) {}; 
     function c(foo,bar) {}; 
     function d(foo,bar) {}; 
     function e(foo,bar) {}; 
     function f(foo,bar) {}; 
} 

我調用該函數是這樣的: for(var i=0; i<5; i++) { charts[i] = a(x[i],y[i],z[i])}

x,y和z是長度爲5的全局數組和一些屬性。現在

,循環獲取網頁加載之前執行和預期也進行了各自爲陣的所有功能(有這些功能的發揮勢必元素的事件監聽器)

比方說,我想訪問一些來自b,c,d,e或f的局部變量「在頁面加載之後,當一個事件被調用時,我該怎麼做?我在這裏談論「範圍」。

我是否必須將整個事物作爲一個對象?

此外,b,c,e和f(局部聲明並且不使用「this」)中存在局部變量。 也有變量裏面的一個是由b,c,d,e和f訪問(再次,本地聲明,不使用「this」)

謝謝!

+0

您不能從創建它們的範圍之外訪問局部變量。您必須將它們暴露給全局範圍,或者在本地範圍內具有getter函數。 – Amberlamps

回答

2

您可以簡單地在a中創建一個新對象並返回該對象。

var a = function (x, y, z) { 
    var result = {}; 
    var outerVal = x; 
    result.b = function (foo, bar) { return foo + bar; }; 
    result.c = function (foo, bar) { return outerVal + result.g + z}; //closure 
    result.d = function (foo, bar) { }; 
    result.e = function (foo, bar) { }; 
    result.f = function (foo, bar) { }; 
    result.g = y; 
    //If you want to execute the functions you can do so 
    result.bValue = result.b(x, y); 
    result.c(y, z); 
    return result; 
}; 

var anA = a(1, 2, 3); 
console.log(anA.bValue); //3 
console.log(anA.b(2, 5)); //7 
console.log(anA.c()); //6 
+0

好吧,如果我在a中創建一個result.g變量會怎麼樣。我可以訪問result.g內部result.b? – KaushikTD

+0

@TaushikTD是的,你可以。您也可以訪問傳入到的本地變量和參數。這被稱爲閉包,並且是JavaScript的一個強大功能。看到我的編輯與result.c()。 (注意:JS中的所有參數都是可選的,anA.c()是合法的,foo和bar是空的) –

0

Amberlamps說過,你不能從它們創建的範圍之外訪問局部變量,這意味着你的函數a不能「看見」在b,c,d,e,f中創建的任何變量。您既可以創建一些全局變量(全局的B,C,d,e和f),或者你可以考慮寫一個封閉:

var something = (function() { 

    var globalOne = null, 
     globalTwo = null; 
     //... 

    return { 

     a: function (x, y, z) { 
      something.b(foo, bar); 
      something.c(foo, bar); 
     }, 

     b: function (foo, bar) { 

     }, 

     c: function (foo, bar) { 

     } 

     // etc. 

    }; 

}()); 

這可能是你想要做什麼有點矯枉過正,但關閉的好處在於您的全局變量globalOneglobalTwo不能被客戶端修改。