javascript - 更改后内部函数无法访问外部函数变量

标签 javascript

是的,这个问题类似于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/

相关文章:

javascript - 只读表单中的所有字段

javascript - 带有 prerender.io 的 nginx/angular/node.js 根 URL

javascript - 为什么我在单击按钮时会附加多个元素?

javascript - 如何使用Appium更改真实设备上的时间?

javascript - 根据日期重新排列数据

javascript - fetch、ajax 和 xhr 之间的区别

javascript - 查询两个字段

javascript - 可枚举是什么意思?

javascript - Promise 运行成功和失败回调

javascript - Angularjs:从 api 获取下一页按钮