通过引用将字符串传递给方法

时间:2014-05-27 05:44:44

标签: javascript jquery event-handling

编辑:抱歉,我忘了提及我无法更改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';
            }
    );


});

3 个答案:

答案 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

如果必须是通过引用传递

,则需要传递对象