3

我试图更好地了解如何使用 JavaScript 和 jQuery 存储变量。

使用下面的代码,为每个 .default-value 元素创建一个名为 default_value 的单独变量。这个对吗?只能从创建它的匿名函数中访问它吗?我听说过“命名空间”这个词,它适用吗?请提供任何其他详细信息,以便我更好地了解发生了什么。

接下来,如果我想将其应用于具有给定 ID 的元素而不是给定类的组,那么使用 each() 似乎是不必要的。应该如何修改?

$('.default-value').each(function() {
    var default_value = this.value;
    $(this).focus(function() {
        if(this.value == default_value) {
            this.value = '';
        }
    });
    $(this).blur(function() {
        if($.trim(this.value) == '') {
            this.value = default_value;
        }
    });
});
4

4 回答 4

7

使用下面的代码,为每个 .default-value 元素创建一个名为 default_value 的单独变量。这个对吗?

是的。每个函数都被调用,并且变量的范围(通过var)到函数。

只能从创建它的匿名函数中访问它吗?

是(请注意,该函数创建了更多匿名函数,并且它们在传递给的函数内,each因此它们也可以访问它)。

我听说过“命名空间”这个词,它适用吗?

于 2012-04-30T16:25:21.170 回答
3

您在谈论的是范围界定

基本上,当您在函数中并使用var关键字(您应该这样做)时,该变量仅在当前范围内可用(在您的情况下为匿名函数)。

如果您跳过var关键字,则该变量将在global范围内可用。

当您想在 DOM 中获取具有 id(始终唯一)的元素时,您可以简单地执行以下操作:

$('#theid').focus(function() { });

您可以做的另一件事是使用hover处理 the.focus()和 的Jquery .blur()

$('#theid').hover(function() {
  // focus in your code
}, function() {
  // blur in your code
});
于 2012-04-30T16:26:15.613 回答
2

如果您在 javascript 中使用 var 作为变量的前缀,它将包含在它被调用的范围内,因此在您的情况下,在您创建的每个循环之外都无法访问 var defaulf_value。

如果没有 var 声明,它将在页面上是全局的。

您可以在 JavaScript 中使用 JSON 样式对象命名变量。

当我写 javascript 时,我会倾向于定义一个这样的命名空间:

mynamespace = {};

然后,当您想在该命名空间中创建变量时,您可以调用:

mynamespace.variableA = "Hello there";

如果您不想覆盖页面上已经存在的变量,这是一种方便的机制。例如:

variableA = "First hello there";
mynamespace.variableA = "Second hello there";

console.log(variableA);
console.log(mynamespace.variableA);

将打印出:

"First hello there"
"Second hello there";

即使您使用了相同的变量名称,扩展第二个变量也不会覆盖第一个变量,因为它位于不同的命名空间 =)

于 2012-04-30T16:29:41.153 回答
1

为每个 .default-value 元素创建一个名为 default_value 的单独变量。这个对吗?

是的你是对的。为文档中找到的每个 jQuery 节点创建 default_value。每次定义函数时,都会创建一个可以包含私有变量的对象。

只能从创建它的匿名函数中访问它吗?

是的,但也可以从该匿名函数内部创建的函数访问它。

我听说过“命名空间”这个词,它适用吗?

术语命名空间表示函数和变量的容器。如果创建一个新的 JS 库,避免与其他库发生冲突非常重要。因此,您无需创建全局“加载”函数,而是创建一个包含该函数的命名空间:

var myLibraryUniqueName = {};
myLibraryUniqueName.load = function() {};

当然,如果库很复杂,您可以创建内部命名空间:

myLibraryUniqueName.loginModule = {};
myLibraryUniqueName.animationModule = {};
...

接下来你问:

如果我想将其应用于具有给定 ID 的元素而不是给定类的组,那么使用 each() 似乎是不必要的。应该怎么修改

function defaultValue(node) {
  var default_value = node.value;
  node.focus(function() {
      if(node.value == default_value) {
          node.value = '';
      }
  });
  node.blur(function() {
      if($.trim(node.value) == '') {
          node.value = default_value;
      }
  }
}
defaultValue($('#id'));
于 2012-04-30T16:39:36.227 回答