JavaScript 对象文字表示法未按预期工作

标签 javascript jquery

我正在使用 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'),代码就会崩溃。

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

最佳答案

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

In the second example, if I remove nsPASS.init(), the code breaks. If I remove Password: $('#Password') the code breaks.

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

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

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

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

关于JavaScript 对象文字表示法未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15281127/

相关文章:

javascript - AngularJS - 触发 Angular 应用程序重新加载数据

javascript - JQuery 单击表格按钮

javascript - jQuery 选择同一父级中具有特定类的另一个元素

javascript - NodeJS 引用错误模块

javascript - 从运行在 Web 浏览器控件中的 JavaScript 脚本调用 C++ 函数

jquery - 有没有办法让所有的 onclick 元素都可以通过键盘导航?

javascript - jQuery : pass argument to ajax error function

javascript - 不显示文本区域占位符文本

javascript - 需要根据属性值对表进行排序

javascript - 关闭多级 jquery 下拉菜单