是的,这个问题类似于Inner function cannot access outer functions variable .但它不是同一个。让我困惑的是“被改变之后”。下面的代码可能更直观。
var serial_maker = function() {
var prefix = '',
seq = 0;
return {
set_prefix: function(p) {
prefix = String(p);
},
set_seq: function(s) {
seq = s;
},
gensym: function() {
var result = prefix + seq;
seq += 1;
return result;
}
};
};
var seqer = serial_maker();
seqer.set_prefix('Q');
seqer.set_seq(1000);
seqer.gensym(); // 'Q1000'
// Rewrite set_seq method
seqer.set_seq = function() {
seq = 2000;
};
seqer.set_seq();
seqer.gensym(); // 'Q1001', which was expected 'Q2000'
所以这就是我想弄明白的——为什么重写的set_seq
方法没有改变外函数中私有(private)变量seq
的值?
希望我能得到一些基本的答案,谢谢 =)
最佳答案
您正在创建一个新的闭包。返回的函数 seqer.set_seq 是一个可以访问私有(private)变量 seq 的闭包。但是新定义的 seqer.set_seq 正在创建一个不能访问私有(private)变量的新闭包,而是创建一个新的全局闭包 window.seq
试一试:
var serial_maker = function() {
var prefix = '',
seq = 0;
return {
set_prefix: function(p) {
prefix = String(p);
},
set_seq: function(s) {
seq = s;
},
gensym: function() {
var result = prefix + seq;
seq += 1;
return result;
}
};
};
var seqer = serial_maker();
seqer.set_prefix('Q');
seqer.set_seq(1000);
seqer.gensym(); // 'Q1000'
// Rewrite set_seq method
seqer.set_seq = function() {
seq = 2000;
};
seqer.set_seq();
seqer.gensym(); // Q1001 is correct!
console.log(window.seq); // 2000
关于javascript - 更改后内部函数无法访问外部函数变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37695683/