27

如何将函数a_href = $(this).attr('href');值传递给全局a_href,使a_href="home"

var a_href; 

    $('sth a').on('click', function(e){
        a_href = $(this).attr('href');

          console.log(a_href);  
         //output is "home"

        e.preventDefault();
    }

console.log(a_href);  
//Output is undefined 
4

3 回答 3

50

您的代码看起来不错,但如果变量声明位于 dom 读取处理程序中,则它不会是全局变量......它将是一个闭包变量

jQuery(function(){
    //here it is a closure variable
    var a_href;
    $('sth a').on('click', function(e){
        a_href = $(this).attr('href');

          console.log(a_href);  
         //output is "home"

        e.preventDefault();
    }
})

要使变量成为全局变量,一种解决方案是在全局范围内声明变量

var a_href;
jQuery(function(){
    $('sth a').on('click', function(e){
        a_href = $(this).attr('href');

          console.log(a_href);  
         //output is "home"

        e.preventDefault();
    }
})

另一种是将变量设置为窗口对象的属性

window.a_href = $(this).attr('href')

为什么控制台打印未定义

您得到输出是undefined因为即使声明了变量,您还没有使用值对其进行初始化,变量的值仅在a单击元素后才设置,直到那时变量将具有 value undefined。如果你没有声明变量,它会抛出一个ReferenceError

于 2013-09-25T03:25:43.840 回答
8

在窗口上设置变量:

window.a_href = a_href;
于 2013-09-25T03:25:01.973 回答
4

您可以通过将全局变量直接添加到全局对象来避免声明全局变量:

(function(global) {

  ...

  global.varName = someValue;

  ...

}(this));

这种方法的一个缺点是global.varName在执行该特定代码行之前不会存在,但这很容易解决。

您还可以考虑一个应用程序架构,其中此类全局变量保存在所有需要它们的函数通用的闭包中,或者作为可适当访问的数据存储对象的属性。

于 2013-09-25T03:55:11.963 回答