Javascript闭包返回NaN?

Javascript闭包返回NaN?,javascript,Javascript,尝试遵循“Javascript:thegoodparts”中的示例,创建一个闭包来实现隐藏。对于具有无法直接更改余额的简单“帐户”对象: <head> <script> var myapp = {}; var account = function() { var value = 0; return { "account_name": "", deposit: funct

尝试遵循“Javascript:thegoodparts”中的示例,创建一个闭包来实现隐藏。对于具有无法直接更改余额的简单“帐户”对象:

    <head>
<script>
    var myapp = {};
    var account = function() {
        var value = 0;
        return {
            "account_name": "",
            deposit: function (amount) {
                value = this.value + amount;
            },
            withdrawal: function (amount) {
                value = this.value - amount;
            },
            balance: function( ) {
                return value;
            }
        }
    }();
    myapp.account = account;
</script>
</head>

<body>
<script>
    myapp.account.account_name = "Fred";
    myapp.account.deposit(100);
    myapp.account.withdrawal(25);

    document.writeln("<p>Account name = " + myapp.account.account_name + "</p>");

    document.writeln("<p>Balance = " + myapp.account.balance( ) + "</p>");


</script>
</body>

var myapp={};
var帐户=函数(){
var值=0;
返回{
“账户名称”:“,
存款:功能(金额){
值=此。值+金额;
},
取款:功能(金额){
value=this.value—金额;
},
平衡:功能(){
返回值;
}
}
}();
myapp.account=账户;
myapp.account.account_name=“Fred”;
myapp.账户存款(100);
myapp.账户提款(25);
document.writeln(“Account name=“+myapp.Account.Account\u name+”

”); document.writeln(“Balance=“+myapp.account.Balance()+”

”);
其结果如下:

帐户名=Fred

余额=NaN


Wny NaN?

之所以发生这种情况,是因为您从未设置此.value。基本上,可以将其固定为仅引用闭包变量

var myapp = {};
var account = function() {
    var value = 0;
    return {
        "account_name": "",
        deposit: function (amount) {
            value = value + amount;
        },
        withdrawal: function (amount) {
            value = value - amount;
        },
        balance: function( ) {
            return value;
        }
    }
}();
myapp.account = account;
myapp.account.account_name = "Fred";
myapp.account.deposit(100);
myapp.account.withdrawal(25);

$('p:nth-child(1)').text('Account name = ' + myapp.account.account_name);
$('p:nth-child(2)').text('Balance = ' + myapp.account.balance());

试试看:我对你的代码做了一点修改。。。。此.value将更改为仅值

<head>
<script>
    var myapp = {};
    var account = function() {
        var value = 0;
        return {
            "account_name": "",
            deposit: function (amount) {
                value = value + amount;
            },
            withdrawal: function (amount) {
                value = value - amount;
            },
            balance: function( ) {
                return value;
            }
        }
    }();
    myapp.account = account;
</script>
</head>

<body>
<script>
    myapp.account.account_name = "Fred";
    myapp.account.deposit(100);
    myapp.account.withdrawal(25);

    document.writeln("<p>Account name = " + myapp.account.account_name + "</p>");

    document.writeln("<p>Balance = " + myapp.account.balance( ) + "</p>");


</script>
</body>

var myapp={};
var帐户=函数(){
var值=0;
返回{
“账户名称”:“,
存款:功能(金额){
价值=价值+金额;
},
取款:功能(金额){
价值=价值-金额;
},
平衡:功能(){
返回值;
}
}
}();
myapp.account=账户;
myapp.account.account_name=“Fred”;
myapp.账户存款(100);
myapp.账户提款(25);
document.writeln(“Account name=“+myapp.Account.Account\u name+”

”); document.writeln(“Balance=“+myapp.account.Balance()+”

”);
当您将
账户
分配给
myapp
时,
范围
缺失,将
var值
置于函数之外

var myapp = {};
var value = 0;
var account = (function(val){
        return{
            value: val,
            "account_name": "",
            deposit: function (amount) {
                value = this.value + amount;
            },
            withdrawal: function (amount) {
                value = this.value - amount;
            },
            balance: function( ) {
                return value;
            }
        }
    })(value);
console.log(account);
myapp.account = account;


myapp.account.account_name = "Fred";
myapp.account.deposit(100);
myapp.account.withdrawal(25);

console.log("<p>Account name = " + myapp.account.account_name + "</p>");

console.log("<p>Balance = " + myapp.account.balance( ) + "</p>");
var myapp={};
var值=0;
var帐户=(函数(val){
返回{
值:val,
“账户名称”:“,
存款:功能(金额){
值=此。值+金额;
},
取款:功能(金额){
value=this.value—金额;
},
平衡:功能(){
返回值;
}
}
})(价值);
控制台日志(帐号);
myapp.account=账户;
myapp.account.account_name=“Fred”;
myapp.账户存款(100);
myapp.账户提款(25);
console.log(“Account name=“+myapp.Account.Account\u name+”

”); console.log(“Balance=“+myapp.account.Balance()+”

”);
Aha。谢谢那么,“这”指的是什么?不是函数,而是函数返回的对象?是的,就是这样。基本上,即使
this
引用函数,它仍然是未定义的,因为
var value=
this.value=
@user1023110:
除非明确设置,否则this
从不引用函数。从MDN:or@user1023110了解有关此的更多信息-此函数也不引用该函数返回的对象。它是由函数的调用方式(或bind的使用)设置的。顺便说一句,通常编写带有括号的立即调用函数表达式(IIFE),如
var f=(function(){…}())
,因此在到达块的末尾之前,更容易看到它们是一个IIFE而不是一个普通的函数表达式,请参见
…}()
。我认为Crockford也是这样写的,事实上不是这样,至少在我提到的Crockford闭包部分。但这可能是个好主意。