Javascript 如何访问匿名函数变量?

Javascript 如何访问匿名函数变量?,javascript,jquery,Javascript,Jquery,无法访问匿名函数中的局部变量。那么在下面的代码中,正确的方法是什么呢?我要做的是,当在输入字段中键入某个内容时,它将与一个值相乘,然后我需要将它添加到一个名为total的变量中。那么这个代码有什么问题 $('#menu input').on('click', function () { total = 0; //if checkbox with id menu1 is checked if ($("input#menu1").is(':checked')) {

无法访问匿名函数中的局部变量。那么在下面的代码中,正确的方法是什么呢?我要做的是,当在输入字段中键入某个内容时,它将与一个值相乘,然后我需要将它添加到一个名为total的变量中。那么这个代码有什么问题

$('#menu input').on('click', function () {
    total = 0;

    //if checkbox with id menu1 is checked
    if ($("input#menu1").is(':checked')) {

    var name = 'menu1';

    $.post('DB.php', {name: name}, function (data) {
        //data is integer value retrieved from the database exmp: data = 200
        $('input#box1price').val(data);

        // multiplying total
        price1 = parseInt(data);
        $('input#box1quantity').keyup(function(){
            q = $(this).val();
            quantity = parseInt(q);
            price1Total = quantity * price1;
            $('input#box1total').val(price1Total);
        });

        total = price1Total; //it's saying price1Total is undefined

        $('#total').show();
        $('#total').text(total);
    });
} 

首先,您应该始终声明变量

其次,在这种情况下,必须在annonymous函数外部声明它,然后在内部使用它

$.post('DB.php', {name: name}, function (data) {
       //data is integer value retrieved from the database exmp: data = 200
        $('input#box1price').val(data);

        // multiplying total
        var price1 = parseInt(data);
        var price1Total = 0;

        $('input#box1quantity').keyup(function() {
            var q = $(this).val();
            var quantity = parseInt(q);
            price1Total = quantity * price1;
            $('input#box1total').val(price1Total);
        });

        var total = price1Total;

        $('#total').show();
        $('#total').text(total);
    });
}

price1Total
将始终在该代码中未定义

在分配为
total=price1Total的事件处理程序之间,不可能触发keyup事件正在求值的语句


您需要重新设计逻辑,使其不依赖于keyup事件,或者使依赖于该事件的所有事情都发生在事件处理程序中。

您为
keyup()定义的匿名函数
callback是一个闭包,这意味着它将在全局范围外执行&代码中未定义变量
total1price
,这意味着JavaScript引擎将自动在全局范围内声明此变量

现在,您的方法的问题是,当您尝试在keyup闭包/回调函数之外引用
total1price
变量时,该变量将不可用,因为在触发keyup处理程序之前不会定义该变量,因此它将包含默认值
undefined

如何解决此问题:

尝试移动下面的行
$('#total').show();
$(#total').text(total1价格)

keyup
事件回调函数中,一旦找到
total1price
的值,就会在DOM上更新总值。

执行
total=price1Total时,您从未定义过
price1Total
total=price1Total
时,在Keyup事件之前不会调用code>Keyup函数listener@Hacketo即使我定义了价格1总额,它总是得到未定义的值,但我需要在它被触发时覆盖它。@monir009然后当它的值更改时,您必须重新执行代码中使用
price1Total
的部分。为此,您可以将该代码移动到一个函数中,并以
price1Total
作为参数调用该函数。不,它不起作用,它仍然以undefined@monir009所以,请为我们创建一个并在那里模拟您的问题,这样我们就可以帮助您解决问题。即使在这里,更新总数也需要在keyup事件处理程序中。定义keyup事件处理程序后,将立即执行行
var total=price1Total
。所以总数永远是0。@Tony是的,我知道总数永远是0。问题是:他有一个
输入框1total
和一个
#total
,我们不知道他想要实现什么。我猜他想在开始时显示这两个属性,并且可能在有人更改
输入时更新这两个属性。但是他的代码非常奇怪,因为他在回调函数中声明了
keyup
事件,显然,他不知道自己在做什么。只要我不能帮上忙,我就把重点放在“如何访问匿名函数变量?”的问题上,并向他解释他必须声明变量等@Tony yeah,我想是的。触发keyup事件时,它需要覆盖该值。它与数据库和另一个用php编写的文件有关,所以我想JSFIDLE不会很好地工作。你的代码没有任何意义,我无法对它进行反向工程来找出你想要实现的目标。一旦你定义了你想要做什么,你就可以知道如何去做。角度,在这一点上,听起来更像是去大规模复杂的MVC框架,不要通过去,不要收集200美元。你的第一段完全是向后的。如果你不坚持
var
在某个东西上,那么它将创建一个全局。无论如何,我有点困惑,谢谢你指出,我已经纠正了它,兄弟。