0

我正在使用 jQuery 1.7。我正在尝试了解命名空间应该如何工作。我可以让某些部分工作,但并不完全像我期望的那样工作。我希望当输入表单元素时,函数 checkPasswordForm 将触发并提醒该字段的值。

我有这个表单元素。

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

我希望这段代码将创建一个命名空间、创建一个对象并创建一个函数。

// SET NAMESPACE
var nsPASS = {

$Password: $('#Password'),

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

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

这段代码虽然没有运行。我收到一条错误消息,提示 $Password 未定义。我修改了代码一千种不同的方法来让它工作。下面的版本按我的预期工作。完成任务所需的代码似乎更多。

// 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(),代码会中断。如果我删除 Password: $('#Password') 代码会中断。

我可以定义对象然后在函数中立即使用它们吗?为什么第一个示例有效,而第二个示例无效?

4

2 回答 2

4

JavaScript 没有命名空间,只有对象。如果您对对象的属性具有某些值,则不能像变量一样仅使用属性名称,您将始终需要通过对象对其进行寻址。

在第二个示例中,如果我删除 nsPASS.init(),代码会中断。如果我删除 Password: $('#Password') 代码会中断。

这是因为一个是隐式全局变量(在函数中分配,在init函数中使用checkPasswordForm) - 另一个是对象的属性nsPass(在对象文字中初始化,在nsPASS.$Password.keyup(…)调用中使用)。所以改成

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

如果您正在编写总是在命名空间对象的上下文中调用的函数(作为方法),您可以使用this关键字作为对该对象的引用。然而,您的特定函数将被称为事件处理程序,因此其上下文就是#Password输入本身。您可以轻松地将其更改为

var Password = $(this).val(); // or shorter: this.value;
于 2013-03-07T20:35:29.553 回答
2

回到您使用的第一个代码块。你应该使用这个:

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

像这样的对象就是这样,您必须始终记住指定在哪里查找变量;)

于 2013-03-07T20:33:22.923 回答