jQuery - 变量范围问题

时间:2010-11-30 14:44:00

标签: javascript jquery variables scope

我有以下javascript:

      $.getJSON('/calculate_quote/' + moulding_1_id, function(data) {
        moulding_1_cost = data.moulding.cost;
        moulding_1_width = data.moulding.width;
      });
      cost_of_moulding = ( ( 2 * ( width + ( 2 * moulding_1_width ) ) + 2 * ( height + ( 2 * moulding_1_width ) ) ) / 1000 ) * moulding_1_cost;
      $('#item_total').html( cost_of_moulding );

问题是在getJSON调用之外未定义两个变量moulding_1_costmoulding_1_width。如何在getJSON调用之外使这两个变量可用?

4 个答案:

答案 0 :(得分:7)

变量不是 set ,直到该回调运行(当服务器返回JSON数据时),所以你需要调用从该回调中使用它们的任何代码,如下所示:

$.getJSON('/calculate_quote/' + moulding_1_id, function(data) {
  var moulding_1_cost = data.moulding.cost;
  var moulding_1_width = data.moulding.width;
  var cost_of_moulding = ( ( 2 * ( width + ( 2 * moulding_1_width ) ) + 2 * ( height + ( 2 * moulding_1_width ) ) ) / 1000 ) * moulding_1_cost;
  $('#item_total').html( cost_of_moulding );
});

或者调用另一个这样的函数:

$.getJSON('/calculate_quote/' + moulding_1_id, function(data) {
  someFunction(data.moulding.cost, data.moulding.width);
});
function someFunction(mqc, m1w) {
  var cost_of_moulding = ( ( 2 * ( width + ( 2 * m1w) ) + 2 * ( height + ( 2 * m1w) ) ) / 1000 ) * m1c;
  $('#item_total').html( cost_of_moulding );
}

在任何一种情况下仍然如此,你需要触发数据一旦使用了数据,所有异步操作都是这样的。

答案 1 :(得分:0)

您应该在getJSON调用中执行所有操作,以确保它以正确的顺序发生。

答案 2 :(得分:0)

事实上,它们没有未定义(代码执行后)。通过跳过var关键字,这些名称将直接进入全局范围(在大多数情况下......为window)。因此,一旦执行了这段脚本,您就可以从脚本的任何位置访问window.moulding_1_cost

这很可能就是你的问题,时机。由于这是ajax request的成功处理程序,因此该代码以异步方式运行,因此不会立即执行。

要解决这个问题,最好自己使用回调函数。尼克克拉弗的答案在这方面有很好的证明。

答案 3 :(得分:-2)

添加

var moulding_1_cost;
var moulding_1_width;

在任何javaScript函数之外;)