2013-03-07 17 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(); 

这就是那样的物体的东西,你要永远记住,指定到哪里寻找变量;)