从方法返回全局变量

时间:2013-12-28 17:02:38

标签: javascript methods scope

我想创建一个在方法内全局访问的变量。 (我想我正在使用正确的术语)。

以jQuery的.hover()为例。在其中,我正在尝试动态访问类名并将其存储在原始.hover()

范围之外的其他方法和函数中以供稍后操作
$('elem').hover(function() {
    var classname = $(this)something;
    return classname;
});

console.log(classname);

我正在尝试全局使用它,因为这会影响更多的方法,而不仅仅是这个方法。

我确信我应该使用完全不同的编程方法来完成这项工作,但在方法之外返回值似乎是我的小知识库可用的唯一过程。

3 个答案:

答案 0 :(得分:2)

您有几个选择:

  1. 在代码周围使用范围函数,并在该范围函数中使用局部变量。 范围函数中的所有函数都可以访问这些变量:

    (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

  2. 使用全局变量,这基本上只是上述情况的一个特例。

  3. 我推荐#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%确定在调用变量时定义了变量。如果你不确定它是否被定义,那么在函数外定义变量的方法肯定更好。