【问题标题】:Jquery , access variable from functionJquery,从函数访问变量
【发布时间】:2010-11-04 19:34:09
【问题描述】:

我有这个代码

function getSelectData(id) {
    jQuery(id).change(function () {
        var value='';
        jQuery(id+" option:selected").each(function () {
            value =jQuery(this).val() ; 
        });
        console.log(value);
    });
    return value;
}

var d = getSelectData("#sort_post_date");
console.log(d);

我如何访问变量“值”,我尝试了不同的方法,但没有,console.log(value) 在哪里; ,值退出,但外面什么都没有,谢谢你的帮助!

【问题讨论】:

    标签: jquery variables closures


    【解决方案1】:

    您不需要将值移动到函数之外,以便将其绑定到闭包。像这样:

    function getSelectData(id) {
        var value='';
    
        // set value to be the current selected value
        value = jQuery(id+" option:selected").val();
    
        // change value whenever the box changes
        jQuery(id).change(function () {
            value = jQuery(id+" option:selected").val();
            console.log("I see a change! -> "+value);
        });
    
        console.log(value);
        return value;
    }
    
    var d = getSelectData("#sort_post_date");
    console.log(d);
    

    这是证明它有效的小提琴:http://jsfiddle.net/ZvuMh/

    【讨论】:

    • 感谢您的帮助!对此,我真的非常感激 !我尝试这种方法但仍然是空的,我可以看到值在哪里是“console.log(value);” , 外部功能更改不起作用 :( , 外部为空
    • 所以console.log(value); 显示正确的值但console.log(d); 没有?
    • console.log(value); 显示正确的值,但 console.log(d); 为空
    • 这是有道理的,您只在更改选择时设置值(代码绑定到更改事件处理程序。)当您调用 getSelectData(..) 时,您将值重置为空白。因此,当您更改它时,您会从事件处理程序中看到 console.log(),但是当您调用 getSelectData 时您看不到——它们在不同的时间运行。
    • 现在显示console.log(value);console.log(d); 列表中的第一个值,只是console.log("I see a change! -> "+value); 显示结果,可能存在一种如何从更改函数中获取变量的方法,因为只是从这个函数变量我看不到它,谢谢霍根的帮助,谢谢你的时间;)
    【解决方案2】:

    这是一个经典的闭包问题。这里有一些最相似的

    Event handlers inside a Javascript loop - need a closure?

    javascript timer or intervals created in loop using closure

    Javascript closure inside loops - simple practical example

    底线,value 变量不是您正在创建的事件处理程序的本地变量。因此,所有您创建的处理程序将具有value 在外部函数结束时所具有的值。在这种情况下,它仍然是空白的。

    【讨论】:

    • 必须有一百万个 em。
    【解决方案3】:

    您不能在声明它的函数之外访问您的值变量。这称为变量范围。阅读变量范围here

    如果你想能够访问一个变量,你需要在一个至少和它被声明的那个一样通用的范围内。

    所以在这种情况下:

    function getSelectData(id){
        var value='';        
        jQuery(id).change(function () {
            jQuery(id+" option:selected").each(function () {
                value =jQuery(this).val() ; 
            });
    
            console.log(value);
        });
        return value;
    }
    
    var d=getSelectData("#sort_post_date");
    console.log(d);
    

    【讨论】:

    • 使用闭包不是更好吗?
    • 我同意——在这里学习使用闭包将永远改变你编写 JavaScript 的方式。
    • @Hogan :当然,没有正确阅读我的代码。虽然你仍然需要了解变量作用域才能理解闭包。
    【解决方案4】:

    尝试在全局范围内定义 value 变量:

    var value='';
    
    function getSelectData(id) {
        jQuery(id).change(function () {
            value='';
            jQuery(id+" option:selected").each(function () {
                value =jQuery(this).val() ; 
            });
        console.log(value);
        });
        return value;
    }
    

    在这里返回“值”也没有意义,因为它是在事件处理程序中设置的......在返回点那里不会有任何东西(或者,只是一个旧值)。

    【讨论】:

    • 有一点。使用闭包可以减少全局范围内的“箔条”。请参阅我的代码示例。
    • 我不明白这是如何关闭的。你没有返回一个函数,你只是返回一个包含字符串的 var。如果您希望每个更改处理程序都跟踪自己以前的值,为什么不在处理程序函数中定义它,并从那里调用一些回调方法呢?好吧,我猜处理程序本身围绕值 var 关闭,所以如果有大量处理程序,一次只跟踪一个 val?这是这个的目标吗?从 getSelectData 返回值似乎仍然没有用。
    • 这是一个闭包,因为function () { value=''; jQuery(id+" option:selected").each(function () { value =jQuery(this).val() ; } 包含对变量value 的引用。 value 包含在函数的闭包中。
    • 这是有道理的,但我仍然不明白从 getSelectedData(id) 返回“值”的意义。由于这是原始类型而不是对象,所以不是返回 value 内容的副本吗?那么,在这种情况下,它很可能是一个空字符串,并且不会被事件处理程序闭包修改,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2017-05-25
    • 2012-10-19
    • 2022-01-10
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多