2013-03-07 21 views
0

我正在使用jQuery 1.7。我正試圖弄清名稱空間應該如何工作。我可以得到一些工作部分,但不完全如我所期望的那樣工作。我期望在輸入表單元素時,函數checkPasswordForm將觸發並提醒字段的值。JavaScript對象文字符號不按預期工作

我有這個表單元素。

<input type='text' id='Password'> 

我期望這段代碼將創建一個名稱空間,創建一個對象並創建一個函數。

// SET NAMESPACE 
var nsPASS = { 

$Password: $('#Password'), 

checkPasswordForm: function() { 
    var Password = $Password.val(); 
    alert(Password); 
} 

}; 
nsPASS.$Password.keyup(nsPASS.checkPasswordForm); 

此代碼不能運行。我得到一個錯誤,說$密碼沒有被定義。我修改了上千種不同的代碼來使它起作用。下面的版本按我的預期工作。看起來更多的代碼比完成任務所需的代碼更多。

// SET NAMESPACE 
var nsPASS = { 

$Password: $('#Password'), 

init: function() { 
    $Password = $('#Password'); 
}, 

checkPasswordForm: function() { 
    var Password = $Password.val(); 
    alert(Password); 
} 

}; 

nsPASS.init(); 
nsPASS.$Password.keyup(nsPASS.checkPasswordForm); 

在第二個示例中,如果我刪除了nsPASS.init(),則代碼會中斷。如果我刪除密碼:$('#密碼')代碼會中斷。

我可以定義對象然後立即在函數中使用它們嗎?爲什麼第一個例子工作,但第二個例子不工作?

+1

在第二個例子你'init'函數定義一個全局變量'$ Password',它不設置對象的'$ Password'財產。 – nnnnnn 2013-03-07 20:32:46

+0

變量和屬性是不同的。 – Peeyush 2013-03-07 20:40:00

回答

4

JavaScript沒有命名空間,但只對象。如果你對某個對象的某個屬性有一定的價值,那麼你不能僅僅使用屬性名稱就像變量一樣,你總是需要通過對象來解決它。

在第二個示例中,如果我刪除了nsPASS.init(),則代碼會中斷。如果我刪除密碼:$('#密碼')代碼會中斷。

這是因爲,一個是隱式的全局變量(在init功能分配,在checkPasswordForm功能使用) - 另一種是你nsPass對象(在對象文本初始化,在nsPASS.$Password.keyup(…)調用中使用的財產)。因此,將其更改爲

var Password = nsPass.$Password.val(); 

如果你正在編寫一個總是在命名空間對象的上下文中調用(如方法)的功能,你可以使用this keyword爲對象的引用。然而,你的特定函數將被稱爲事件處理函數,所以它的上下文是輸入本身。您可以輕鬆地將它更改爲

var Password = $(this).val(); // or shorter: this.value; 
2

返回到您使用的第一個代碼塊。您應該使用這樣的:

var Password = nsPASS.$Password.val(); 

這就是那樣的物體的東西,你要永遠記住,指定到哪裏尋找變量;)