0

基本上我希望console.log 输出'是的',但事实并非如此。我能做些什么来让它输出是的,而不是直接在里面引用它usefulFunction

App = {
    config: {
        updateThis: 'false'
    },
    init: function(){
        this.usefulFunction(this.config.updateThis);
        this.consoleIt();
    },
    usefulFunction: function(item){
        item = 'yeah';
        // swap the above line for the line below and it works as expected
        // this.config.updateThis = 'yeah';
    },
    consoleIt: function(){
        console.log(this.config.updateThis);
    }
}

App.init();
4

3 回答 3

2

在 中 usefulFunction,您期望通过引用传递的 C++ 样式会影响对 的原始引用config.updateThis,但是,当您调用

 this.usefulFunction(this.config.updateThis);

您正在创建对 'false' 字符串的新引用(传递给usefulFunction),并且无法更新 from 中的原始this.config引用usefulFunction

解决此问题的唯一方法是传递要更新的对象的名称。同样,在 JS 中没有 C++ 引用传递。工作示例

App = {
    config: {
        updateThis: 'false'
    },
    init: function(){
        this.usefulFunction(this.config, 'updateThis');
        this.consoleIt();
    },
    usefulFunction: function(object, prop){
        object[prop] = 'yeah';
    },
    consoleIt: function(){
        console.log(this.config.updateThis);
    }
}

问题不在于字符串是不可变的

ᚗ̸̢̛͝ 声称问题在于字符串是不可变的;然而,问题远不止于此。字符串是不可变的这一事实意味着您不能更改当前引用(因此所有其他引用都会更新),但即使它们是可变的,您也不能只设置单独的引用并影响现有引用

var a = {b:1};
function change(obj) {
    // This is assigning {c:2} to obj but not to a
    // obj and a both point to the same object, but 
    // the following statement would simple make obj point to a different object
    // In other languages, you could define function(&obj) {}
    // That would allow the following statement to do what you intended
    obj = {c:2};
}

change(a);
console.log(a); // still {b:1}
于 2013-02-19T21:45:56.370 回答
2

您可以将对象(而不是字符串对象)传递给您的函数。这是因为 JavaScript 字符串是不可变的。

原始值

除了对象之外的所有类型都定义了不可变的值。具体来说,字符串是不可变的(例如,与 C 不同)。我们将这些类型的值称为“原始值”。这在下面的字符串部分中有更详细的解释。

来源:https ://developer.mozilla.org/en-US/docs/JavaScript/Data_structures


如果你想传递一些可变的东西给你的函数,传递一个对象。

// Calling code
this.usefulFunction(this.config);

// Useful function isn't very useful
usefulFunction: function(config) {
   config.updateThis = "some new value";
}

回到您的示例,通过函数更新配置对象。

// Calling code
this.usefulFunction("updateThis", "some new value");

// Useful function is a bit useful
usefulFunction: function(name, value) {
    this.config[name] = value;
}
于 2013-02-19T21:49:43.110 回答
0

假设您的代码确实有效:

App = {
    config: {
        updateThis: 'false'
    },
    init: function(){
        this.config.updateThis=this.usefulFunction( this.config.updateThis);
        this.consoleIt();
    },
    usefulFunction: function(item){
       return item = 'yeah';
        // swap the above line for the line below and it works as expected
        // this.config.updateThis = 'yeah';
    },
    consoleIt: function(){
        console.log(this.config.updateThis);
    }
}
于 2013-02-19T21:45:28.900 回答