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