如何为非匿名函数的getJson回调添加额外的参数?

时间:2014-11-02 12:39:30

标签: javascript jquery callback arguments data-transfer

我有以下工作代码:

newParam=1;
$.getJSON('http://date.jsontest.com/', (function (x) {
    return function (data) {
      alert(x);     
    }}(newParam)));

newParam=2;

demo

我想让内部函数不是匿名的。但我不能:

newParam=1;
$.getJSON('http://date.jsontest.com/', (function (x) {
    return func ;}(newParam)));

newParam=2;

function func(data) {
      alert(x);     
    }
消息:x is not defined

请帮助重构此代码。

1 个答案:

答案 0 :(得分:2)

如果希望内部函数能够访问外部函数的作用域(在本例中为x参数),则需要在外部实际声明内部,如下所示:

newParam=1;
$.getJSON('http://date.jsontest.com/', funcFactory(newParam));

function funcFactory(x) {
  return function func(data) {
      alert(x);     
  };
}

或者您可以修改第二个示例以使用dfsq建议的.bind(),但进行一些调整 - 使用它来设置this对象但参数(因为当jQuery使用JSON请求的结果调用它时,它将设置参数:

newParam=1;
$.getJSON('http://date.jsontest.com/', function (x) {
    return func.bind({param: x});
}(newParam));

newParam=2;

function func(data) {
   alert(this.param);   // note use of this
   alert(data);     
}

演示:http://jsfiddle.net/x0eqpv6f/11/

虽然如果你要使用.bind(),你根本不需要匿名功能:

$.getJSON('http://date.jsontest.com/', func.bind({param: newParam}));

function func(data) {
   alert(this.param); // note use of this
   alert(data);     
}

演示:http://jsfiddle.net/x0eqpv6f/12/