编辑:抱歉,我忘了提及我无法更改plugins.js。许多其他应用程序都使用它。
我正在尝试将 responseName
参数传递到 jQuery 单击处理程序中作为引用。然而它是作为一个值传递的。
在我的回调函数中,我将 time.ref
更改为 'b'
,但当它在 sendResponse()
中发送回服务器时code> 它仍在发送 'a'
。我该如何解决这个问题?
Plugins.js
Whispir.plugins.customResponseRules = {
attachResponse: function(selector, responseName, callback){
$(selector).on('click', function(){
if (_.isFunction(callback)) {
callback();
}
sendResponse({
textPrompt: responseName,
name: responseName
});
});
}
}
主要代码
var time = {ref: 'a'};
$(document).ready(function() {
Whispir.plugins.customResponseRules.attachResponse(
'#ok-button',
time.ref,
function(){
time.ref = 'b';
}
);
});
最佳答案
您的实际问题是您正在更改回调中的原始对象,但发送到服务器的内容是传递给函数的内容。一旦更改了原始对象,它们就不再相同。
字符串在 JavaScript 中是不可变的,它们实际上总是通过引用传递。
但是,因为它们是不可变的,所以您无法更改该特定字符串(对字符串的所有更改,创建一个新字符串),因此如果您想要做的是更改传入的字符串,那么您需要将字符串嵌入为对象的属性并传递该对象。
<小时/>因此,在您的特定代码中,您可以传递 time
对象而不是 time.ref
字符串。这样,您就可以在函数中将 time.ref
更改为您想要的任何内容,只要在发送到服务器之前从 time.ref
获取数据,您就可以始终拥有最新数据:
Whispir.plugins.customResponseRules = {
attachResponse: function(selector, responseObj, callback){
$(selector).on('click', function(){
if (_.isFunction(callback)) {
callback();
}
sendResponse({
textPrompt: responseObj.ref,
name: responseObj.ref
});
});
}
}
var time = {ref: 'a'};
$(document).ready(function() {
Whispir.plugins.customResponseRules.attachResponse(
'#ok-button',
time,
function(){
time.ref = 'b';
}
);
});
<小时/>
现在,OP 通知我们插件代码无论如何都无法更改。
如果你不能修改插件,那么你就不能这样做。该插件正在将您传递给它的内容作为参数发送,并且您无法从插件外部更改该参数。私有(private)范围内的字符串参数,因此如果您无法更改该范围内的代码,那么您也无法更改它。
关于javascript - 通过引用将字符串传递到方法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23881844/