4

次の単純な JavaScript モジュール パターンを検討してください。

var human = (function () {
    var _name = '';
    return {
        name: _name,
        setName: function (name) {
            _name = name;
        }
    }
})();
human.setName('somebody');
alert(human.name); // shows an empty string
human = (function () {
    var _name = '';
    return {
        name: function() {
            return _name;
        },
        setName: function (name) {
            _name = name;
        }
    }
})();
human.setName('somebody');
alert(human.name()); // shows 'somebody'

最初のクロージャーが機能しないのに、2 番目のクロージャーが正常に機能するのはなぜですか? ここで例を参照してください。

この fiddleも参照してください。これは、getter 関数の代わりに単純なプロパティを使用できることを証明しています。

4

2 に答える 2

8

JavaScriptで

  • 文字列とプリミティブ型 (ブール型と数値型) は値で渡されます
  • オブジェクト、配列、および関数は参照によって渡されます

name は文字列であるため、 への参照ではなく、name: _nameの現在の値が格納されます。_name_name

setNameあなたの例では のみを変更します_name

getName_name現在の値を保持するものにアクセスします。

.name初期化中に設定されたコピーされた値にアクセスします ( name: _name)。

SO: 参照による Javascript と値による Javascriptも参照してください。

于 2013-02-05T12:29:15.137 に答える
1

これを試してください:

var human = (function () {
    var _name = '';
    var returnObj = {};
    returnObj.name = _name;
    returnObj.setName = function (name) {
        _name = name;
        returnObj.name = name;
    };

    return returnObj;
})();
human.setName('somebody');
alert(human.name);

あなたのコードの問題はsetName、変数に値を割り当てていて、返されたオブジェクトのプロパティに_nameアクセスしていたことです。name

于 2013-02-05T12:29:39.190 に答える