最简单的情况,一个回调函数: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下的信号处理函数,而我们知道,信号处理函数要求必须是可重入的,可重入一个重要标准就是不能读写全局和静态变量。那这种问题要怎么解决呢
var callback = function(v){
value = v;
processValue();
var processValue = function(){
doSomeProcess(value);
}这个回调函数callback可能是被一次用户鼠标点击触发,也可能是ajax的回调。当其调用频率足够频繁的时候,就无法保证processValue();中读到的全局的value还是其调用者callback 所接受到的值了。因为很可能在value=v;和processValue();这两个语句中间callback又被触发了。有没有什么比较通用的方法来保护这个value呢?据我所知好像有点难,因为这不是线程,没有线程ID,而更像是某种比如linux下的信号处理函数,而我们知道,信号处理函数要求必须是可重入的,可重入一个重要标准就是不能读写全局和静态变量。那这种问题要怎么解决呢
解决方案 »
- 怪、怪、怪、牛人们,请帮忙完善代码。
- 求助各位大侠正则表达式
- 提供试听的音乐,怎样才能有效地防止用户下载
- 梅花树生成的静态页面。。。怎么做???求JS高手,或梅花雪大大帮忙!!
- extjs里面的grid网格对大量数据输入,有没有方便一点的批量复制输入呢?
- 想在单击"提交"按钮时让隐藏域的缺省值自动等于被选中的复选框的值
- 很急!从一个列表框中选择多个项目到另一个列表框中
- 怎么把input的值传递给iframe的src属性?
- 大家帮帮忙!在线等待!!!
- html怎样接受从另一个html (form action) post 过来的数据?
- 高手帮我看看这种切换的功能怎么来写.
- extjs下根据导航树动态调用tabpanel的问题
this.val = v;
processValue(this.val);
var processValue = function(val){
doSomeProcess(val);
}
var callback = function(v){ var _value = v || value;
value = _value; processValue();
var processValue = function(){
// 让这个_value引用上面的的局部变量
doSomeProcess(_value);
}
}
var callback = function(v){ var _value = v || value;
value = _value; processValue(_value);
}
var processValue = function(v){ doSomeProcess(v);
}
一致性问题,说得专业些,也就是this指针指向问题,它会随着程序执行环境的改变而改变!处理方法楼上都已经说过了,保存当前执行对象,进入另一个函数内,就能直接使用!全局对象是一定要用的,只是我们可以通过JS闭包,封装等处理,让全局对象尽可能减少,优化结构达到某种预期的效果!说到底就是禁止大量使用全局不代表不用全局!
至少是一个对象吧 不能只用一个简单的基础类型的变量另外更具你描述的场景 每个方法处理的value其实是独立的 所以全局的value没有意义当然办法还是有的 可以改一下
要更新的value值 先被处理 处理完后才被 更新到全局变量中value = 5;
var callback = function(v){
//value = v;
processValue();
var processValue = function(){
doSomeProcess(v);
}
function doSomeProcess(){
//doing....
value = v;
}...
value = 5;
var callback = function(v){
value = v;
processValue();
function processValue(){
doSomeProcess(v);
}
}
这个可以利用cookie,也可以利用document中的非显示对象的系统属性或自定义属性。