我想创建一个在方法内全局访问的变量。 (我想我正在使用正确的术语)。
以jQuery的.hover()
为例。在其中,我正在尝试动态访问类名并将其存储在原始.hover()
$('elem').hover(function() {
var classname = $(this)something;
return classname;
});
console.log(classname);
我正在尝试全局使用它,因为这会影响更多的方法,而不仅仅是这个方法。
我确信我应该使用完全不同的编程方法来完成这项工作,但在方法之外返回值似乎是我的小知识库可用的唯一过程。
答案 0 :(得分:2)
您有几个选择:
在代码周围使用范围函数,并在该范围函数中使用局部变量。 范围函数中的所有函数都可以访问这些变量:
(function() {
var classname = "";
$('elem').hover(function() {
classname = this.className;
});
$('some other elem').on('some-other-event', function() {
console.log(classname);
});
})();
请注意第二个事件处理程序如何访问hover
处理程序可以访问的同一个变量。在这两种情况下,它们都有对变量的持久引用,而不是变量的副本。更多:Closures are not complicated。
使用全局变量,这基本上只是上述情况的一个特例。
我推荐#1。这是一个完整的例子:Live Copy | Source
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<meta charset=utf-8 />
<title>Simple Closure</title>
<style>
.a, .b, .c {
width: 60px;
border: 1px solid black;
}
</style>
</head>
<body>
<p>Hover over these:</p>
<div class="a">a</div>
<div class="b">b</div>
<div class="c">c</div>
<script>
(function() {
var prevClassHovered = "";
var lastClassHovered = "";
// Remember the last hovered thing
$(".a, .b, .c").hover(function() {
lastClassHovered = this.className;
});
// Output the last one every ~500 ms, if it's
// changed. Here the event in question is a
// timer event, but of course it can be anything.
setInterval(function() {
if (prevClassHovered !== lastClassHovered) {
prevClassHovered = lastClassHovered;
display(lastClassHovered);
}
}, 500);
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();
</script>
</body>
</html>
答案 1 :(得分:1)
你必须做类似
的事情var classname;
$(document).ready(function () {
$('elem').hover(function () {
classname = $(this) something;
console.log(classname);
});
$('elem').click(function () {
console.log(classname);
})
});
console.log(classname);
现在你可以随处使用
答案 2 :(得分:1)
您可以通过在函数外定义变量或通过window.varName = 'value'
定义变量来定义全局变量。例如:
$('elem').hover(function() {
window.classname = $(this)something;
return classname;
});
然后变量classname将被全局定义,您可以通过简单地将其视为任何其他变量来调用它。每次调用它时都不需要添加window.
。
或者,就像nzn所说,你可以在函数外部定义变量,然后在不预先var
的情况下分配一个新值。例如:
var classname;
$('elem').hover(function() {
classname = $(this)something;
return classname;
});
这将与window.
方法完全相同,但在这种情况下,您首先需要在函数外部定义变量,而不需要使用window.classname
。请记住,你应该注意全局变量。在调用全局值之前,您应该100%确定在调用变量时定义了变量。如果你不确定它是否被定义,那么在函数外定义变量的方法肯定更好。