理解javascript变量

时间:2012-04-30 16:21:56

标签: javascript jquery

我试图更好地理解变量是如何与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 个答案:

答案 0 :(得分:7)

  

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

是。为每个函数调用该函数,并将变量作用域(通过var)到函数。

  

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

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

  

我听过“名称空间”一词,是否适用?

没有

答案 1 :(得分:3)

您所说的是scoping

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

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

如果你想在DOM中获得一个带有id(总是唯一的)的元素,你可以这样做:

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

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

$('#theid').hover(function() {
  // focus in your code
}, function() {
  // blur in your code
});

答案 2 :(得分:2)

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

如果没有var声明,它将在页面上显示为全局。

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

当我写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";

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

答案 3 :(得分:1)

  

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

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

  

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

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

  

我听过“名称空间”一词,是否适用?

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

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

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

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

接下来你问:

  

如果我想将它应用于具有给定ID而不是a的元素   给定类的组,然后使用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'));