访问在 change 方法之外的 change 方法中更改的变量值?

Accessing the value of variable that is changed in a change method outside of the change method?

我以前试过问过这类问题,但我不明白我想做的事情是否可行。当事情发生变化时,例如 select 下拉列表被更改或复选框被选中或未选中时,是否可以将这些值放在全局变量中,以便我稍后可以在代码中使用这些值 例如我想做这样的事情

var amountChosen;

$('#amountItems').change(function(){
            amountchosen = $('#amountItems option:selected').val();
            alert(amountchosen)
});

所以我希望 amountChosen 的值在 change 方法中发生变化,因为我知道它是这样工作的,但我不会将其应用于全局变量。

因为我想在另一个函数的深处做这样的事情

if(amountChosen == 2){
    do this
}
if(amountChosen == 3){
    do this
}
etc.

我永远无法在 change 方法之外获取值,这是个大问题。

如果我的代码中有某个地方,我需要提取信息的部分,比如用户检查过的这个和他选择的项目数量。据我所知,我必须在 .change 方法或 .is('checked') 中完成所有这些工作。如何使更改的变量在远离代码的函数的参数中可用。

总结一下。我有不同的功能根据状态做不同的事情(我猜它就是这样叫的)。我在函数中获取更新状态时遇到问题,因此我可以根据状态采取行动

您可能想要探索使用事件发射器或发布-订阅系统。由于您已经在使用 jQuery,因此很容易创建我们自己的发射器。

$emitter = $({});

function foo() {
  $('#amountItems').change(function(){
    var amountchosen = $('#amountItems option:selected').val();
    $emitter.trigger('amountUpdate', amountchosen);
  });
}

function bar() {
  $emitter.on('amountUpdate', function(e, amount){
    // do something with the amount
  });
}

这使您处于相同的情况,两个函数都需要在其范围内包含事件发射器,但发射器可以是许多未耦合或松散耦合的组件相互通信的通道。

一个非常简单的解决方案是简单地将值保存在某处,然后稍后查找:

<input type="text" id="amountItems" data-amount-chosen="0">

$('#amountItems').change(function(){
    amountchosen = $('#amountItems option:selected').val();
    $('#amountItems').data("amount-chosen", amountchosen);
    alert(amountchosen);
});

// somewhere later...
var amountchosen = $('#amountItems').data("amount-chosen");
if(amountChosen == 2){
    do this
}
if(amountChosen == 3){
    do this
}
etc.

请注意,我们只是更改了 html 标签以添加一个数据元素,将正确的数据保存在那里,然后在需要时再次查找。

您不需要做任何特别的事情:如果您使用定义为 "outside" 函数作用域的变量,则会创建一个闭包,函数将保留对该变量的引用。如此多的函数可以引用同一个变量。

例如在你的代码中非常高(比如在全局级别):

// At the top of your main file.js
var myVar = initialValue;

// somewhere deeper into the code (getter)
function one() {
  if (myVar === something) { ... }
}

// Somewhere else like from another file (setter)
function two() {
  myVar = something;
}

如果您无法访问这些函数之一的 myVar,则意味着您没有将 myVar 声明得足够高。当我说 "high" 时,我在考虑范围层次结构:

// global level, very high
var rootVariable;

function toto() {
  // toto level, has access to rootVariable
  var totoVar;
}

function tutu() {
  // tutu level, has access to rootVariable but not totoVar
  var tutuVar;
}

如果我误解了你的问题或者仍然不起作用,请尝试创建一个 jsfiddle 来重现你的问题。