为什么这个JavaScript属性返回空字符串,而JavaScript函数工作正常?

时间:2013-02-05 12:25:28

标签: javascript properties closures getter-setter

考虑这个简单的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'

为什么第二个闭包工作正常,而第一个闭合不起作用?请参见示例here

另请参阅this fiddle,这证明可以使用简单属性代替getter函数。

2 个答案:

答案 0 :(得分:8)

在Javascript中

  • 字符串和基本类型(布尔值和数字)按值
  • 传递
  • 对象,数组和函数通过引用传递

由于名称是字符串name: _name,因此会存储_name的当前值,而不是_name的引用。

您的示例中的

setName将仅修改_name

getName将访问包含当前值的_name

.name将访问初始化期间设置的复制值(name: _name)。

另见SO: Javascript by reference vs. by value

答案 1 :(得分: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属性。

相关问题