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

関数に (文字列オブジェクトではなく) オブジェクトを渡すことができます。これは、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 に答える
2

では usefulFunction、参照渡しの C++ スタイルが への元の参照に影響を与えることを期待していますがconfig.updateThis

 this.usefulFunction(this.config.updateThis);

「false」文字列への新しい参照を作成しています (に渡すため)。元の参照をfromusefulFunctionで更新することはできません。this.configusefulFunction

これに対処する唯一の方法は、更新するオブジェクトの名前を渡すことです。繰り返しになりますが、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 に答える
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 に答える