比如下面这个代码,我自己也设置了一个函数f, 为什么callback能显示出局部变量a,而我自己设置的f函数不能,报错:“ReferenceError: a is not defined”,也就是说callback传递过程中怎么做到的保持原来的作用域?$("#btn").click(function(e){
var a=999;
var f=function(){
alert(a)
}
$.getJSON("http://127.0.0.1/js.php?f="+f+"&callback=?",function(data){
alert(a)   
})
})
js.php代码:$callback=$_REQUEST['callback'];
echo "(".$callback.")".'();';
$f=$_REQUEST['f'];
echo "(".$f.")".'();';

解决方案 »

  1.   

    不行,jsonp操作中f已经脱离click作用域了"http://127.0.0.1/js.php?f="+f+"&callback=?"这个样得到url地址是"http://127.0.0.1/js.php?f="+f+"&callback=?"http://127.0.0.1/js.php?f=function () {
        alert(a);
    }
    &callback=?f转换为函数体了,改成下面的就行
    $("#btn").click(function(e){
        var a=999;
        window.f=function(){
            alert(a)   
        }
        $.getJSON("http://127.0.0.1/js.php?f=f&callback=?",function(data){
            alert(a)   
        })
    })
      

  2.   

    胡来,既然要用$.getJSON返回的数据应该是json格式呀,f参数就算你能传成功那有什么用,php直接输出f函数就可以当json数据?
      

  3.   


    版主 我知道f已经脱离click,但我想知道为什么callback没有脱离?jsonp是如何做到的
      

  4.   


    我想自己写一个纯js的,代替jsonp 实现跨域
      

  5.   

    $.getJSON也是纯js封装来的呀,你看看人家源码不就行了。
      

  6.   

    callback 里的a 是回传回来执行的 。,所以原始上下文 也就是var a=999;还存在.
      

  7.   


    版主 我知道f已经脱离click,但我想知道为什么callback没有脱离?jsonp是如何做到的jquery自己注册的回调也是全局的,脱离了click作用域,你传递的回调函数是再click作用域内引用了a变量,形成了闭包,多以获取到a变量。。和我1#的将f修改为全局的一样,引用到了click事件中的a变量,形成了闭包。。