2012-02-23 84 views
0

我有建立這樣的JavaScript對象:對象屬性最初返回undefined,但在重新定義返回預期值

var Dashboard = { 
    form: { 
    action: function(){ 
     return $('#upload_form').attr('action'); 
    }(), 
    //snip (more functions) 
    } 
} 

如果我叫(在WinXP使用Chrome 17)Dashboard.form.action在Chrome控制檯後加載頁面(我查了腳本和功能有)的結果是undefined,但是,如果我再使用相同的功能重新定義Dashboard.form.action

Dashboard.form.action = function(){ 
    return $('#upload_form').attr('action'); 
}(); 

,並隨後調用它,它按預期工作!

我在做什麼錯?這是一個錯誤,還是我只是在推崇它?

+0

您創建並初始化該對象,但HTML表單目前未加載......這可能是錯誤嗎? – silly 2012-02-23 12:33:21

回答

2

更新

重新下方的評論:

實際上是我想要做的是結果賦給action屬性...

在你的問題說:

如果我打電話... Dashboard.form.action ...

這使得它看起來像你期待action是一個函數(你不要「調用」非函數)。

如果您希望它是一個字符串(來自#upload_form的「action」屬性值),則根本不需要使用函數。但你需要確保你在做#upload_form元素已經存在於DOM中。

要麼這麼做,要麼將您的腳本放在標記下面(anywhere below很好; just before or just after the closing </body> tag工作正常),要麼將您的腳本包裝在ready調用中。

所以,你的代碼變爲:這如果是#upload_form在標記:

var Dashboard = { 

    form : { 
     action : $('#upload_form').attr('action'), 

     //snip (more functions) 
    } 
}; 

...或者這個,如果你想使用ready(任何使用Dashboard將不得不等待別人直到ready爲好):

jQuery(function($) { 
    var Dashboard = { 

     form : { 
      action : $('#upload_form').attr('action'), 

      //snip (more functions) 
     } 
    }; 
}); 

注意,在第二種情況下,Dashboard將不再是一個全球變量。這是一個好事,但如果你需要它是全球出於某種原因,你可以將其導出:

jQuery(function($) { 
    var Dashboard = { 

     form : { 
      action : $('#upload_form').attr('action'), 

      //snip (more functions) 
     } 
    }; 

    // Export the global 
    window.Dashboard = Dashboard; 
}); 

只要確保沒有嘗試使用Dashboardready之前已經解僱。


原來的答覆

你有一個額外的對()

action: function(){return $('#upload_form').attr('action');}() 
//            here -------^^ 

通過把他們那裏,你通話立即功能,並指定結果稱它爲action屬性。你只是想分配的功能本身的財產,所以不要把()末叫它:

action: function(){return $('#upload_form').attr('action');} 

這是正是你就不會在這裏使用()同樣的原因(讓我們假設你有一個名爲foo功能),如果你想ffoo

var f = foo; 

如果說

var f = foo(); 

...你會是致電foo,不是指它。

+0

實際上我想做的是將結果分配給動作屬性,我只是不知道爲什麼它不這樣做。 – OverLex 2012-02-23 14:02:41

+0

@OverLex:啊,好的。然後你根本不需要一個功能(這和你說的「電話」讓我困惑)。查看更新後的答案。 :-) – 2012-02-23 14:34:04

+0

謝謝,解決了它! – OverLex 2012-02-23 16:32:03