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