编辑:抱歉,我忘了提及我无法更改plugins.js。它被许多其他应用程序使用。
我正在尝试将responseName
参数传递给jQuery点击处理程序作为参考。然而,它作为一个值传递。
在我的回调函数中,我将time.ref
更改为'b'
,但当它在sendResponse()
中发送回服务器时,它仍在发送'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';
}
);
});
答案 0 :(得分:2)
您的实际问题是您正在更改回调中的原始对象,但发送到服务器的是传递给该函数的内容。一旦你改变了原始对象,它们就不再相同了。
字符串在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告诉我们无论如何都无法更改插件代码。
如果你无法修改插件,那么你就无法做到。插件将您传递给它的内容作为参数发送,并且您无法从插件外部更改该参数。私有范围中的字符串参数,因此如果您无法更改该范围内的代码,则无法更改它。
答案 1 :(得分:1)
在JavaScript中,字符串是不可变的,始终通过引用传递。
这是什么意思?
这意味着一旦初始化字符串就不能更改。您可以使用新字符串替换字符串,但在将字符串传递给函数时,不能“更改引用所指向的值”。
这里已经有了一些很好的答案,但我会为你提供一个可以应用于其他地方的概念性答案。
var myObject = { myString : "Hello, World!" }
function changeStr(str) {
str = "Goodbye, World!";
}
function changeObj(obj) {
obj.myString = "Goodbye, World!";
}
changeStr(myObject.myString);
alert(myObject.myString); // will alert "Hello, World!"
changeObj(myObject);
alert(myObject.myString); // will alert "Goodbye, World!"
答案 2 :(得分:0)
在time
time.ref
并访问responseName
而不是sendResponse
如果必须是通过引用传递
,则需要传递对象