最简单的情况,一个回调函数:value = 5;
var callback = function(v){
    value = v;
    processValue();
var processValue = function(){
    doSomeProcess(value);
}这个回调函数callback可能是被一次用户鼠标点击触发,也可能是ajax的回调。当其调用频率足够频繁的时候,就无法保证processValue();中读到的全局的value还是其调用者callback 所接受到的值了。因为很可能在value=v;和processValue();这两个语句中间callback又被触发了。有没有什么比较通用的方法来保护这个value呢?据我所知好像有点难,因为这不是线程,没有线程ID,而更像是某种比如linux下的信号处理函数,而我们知道,信号处理函数要求必须是可重入的,可重入一个重要标准就是不能读写全局和静态变量。那这种问题要怎么解决呢

解决方案 »

  1.   

    可以把一些值定义为内部属性,一个对象对应一个,应该就可以了吧var callback = function(v){
        this.val = v;
        processValue(this.val);
    var processValue = function(val){
        doSomeProcess(val);
    }
      

  2.   

    ajax不要用异步用同步,不行吗
      

  3.   

    一个简单的问题,为什么要用全局变量?value = 5;
    var callback = function(v){ var _value = v || value;
        
    value = _value;    processValue();
    var processValue = function(){
    // 让这个_value引用上面的的局部变量
    doSomeProcess(_value);
    }
    }
      

  4.   

    value = 5;
    var callback = function(v){    var _value = v || value;
        
        value = _value;    processValue(_value);
      
    }
      var processValue = function(v){        doSomeProcess(v);
        }
      

  5.   

    楼上的可能误解我的问题了,我这只是一个例子,实际情况代码应该不是这样的,也就是说很有可能无法避免用全局对象,或者说情况可能是那个value是一个成员属性,而很多个成员函数可能同时对其进行读写。要是能轻易避免全局对象或者竞争,那c++,java还需要同步机制么
      

  6.   

     
         一致性问题,说得专业些,也就是this指针指向问题,它会随着程序执行环境的改变而改变!处理方法楼上都已经说过了,保存当前执行对象,进入另一个函数内,就能直接使用!全局对象是一定要用的,只是我们可以通过JS闭包,封装等处理,让全局对象尽可能减少,优化结构达到某种预期的效果!说到底就是禁止大量使用全局不代表不用全局!
      

  7.   

    信号
    至少是一个对象吧 不能只用一个简单的基础类型的变量另外更具你描述的场景 每个方法处理的value其实是独立的 所以全局的value没有意义当然办法还是有的 可以改一下
    要更新的value值 先被处理 处理完后才被 更新到全局变量中value = 5;
    var callback = function(v){
        //value = v;
        processValue();
    var processValue = function(){
        doSomeProcess(v);
    }
    function doSomeProcess(){
       //doing....
       value = v;
    }...
      

  8.   

    函数内部用局部变量,直接用v就好了嘛
    value = 5;
    var callback = function(v){
        value = v;
        processValue();
        function processValue(){
            doSomeProcess(v);
        }
    }
      

  9.   

    没细看,大概的意思好像是保存共享数据供使用。
    这个可以利用cookie,也可以利用document中的非显示对象的系统属性或自定义属性。