2014-11-02 48 views
1

我有以下工作代碼:如何爲非匿名函數添加getJson回調的附加參數?

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

請幫助重構此代碼。

+0

嘗試'回報func.bind (null,x);'。或者只是'$ .getJSON('http://date.jsontest.com/',func.bind(null,newParam));'。 – dfsq 2014-11-02 12:51:09

+0

x未定義http://jsfiddle.net/x0eqpv6f/7/ – gstackoverflow 2014-11-02 12:55:16

+0

您嘗試解決的更高級別問題是什麼? – charlietfl 2014-11-02 12:58:00

回答

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()你不需要匿名函數都:

​​

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

+0

和我的第一個例子有什麼不同? – gstackoverflow 2014-11-02 13:03:31

+0

你說你不希望它是匿名的,所以這就是我給你的 - 連同一個(簡短的)解釋爲什麼你的第二個例子不起作用。 – nnnnnn 2014-11-02 13:04:44

+0

現在我的函數func在另一個地方聲明,我不能在每個回調中重新聲明它 – gstackoverflow 2014-11-02 13:04:45