很难理解为什么这个函数在 JavaScript 中不起作用

having hard time why this function doesn't work in javascript

本文关键字:JavaScript 不起作用 函数 难理解 为什么      更新时间:2023-09-26

我很难理解为什么这个东西不起作用。 问题出在哪里?这是将值传递给此函数的正确方法吗,还有其他方法吗?

seqer.set_prefix = 'Q';
seqer.set_seq = 1000;

是否可以这样做:

sequer.set_prefix('Q');

var serial_maker = function () {
        var prefix = '';
        var seq = 0;
        return {
            set_prefix: function (p) {
                prefix = 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'; // is this the right way to pass in values to this function, are there other ways? is it possible to write like this sequer.set_prefix('Q);
seqer.set_seq = 1000; // same here?
seqer.gensym()

;

匿名函数在 JavaScript 中是一等公民 - 您通常可以像对待普通函数一样对待它们(除了它们没有给定的标识符,除非您将它们分配给名称)。这里有一个关于它们的很好的教程 - 它们非常强大,我认为它们是 JavaScript 中最好的东西之一。

所以是的,做:

seqer.set_prefix = 'Q';
seqer.set_seq = 1000;

是不正确的。您正在用这些常量覆盖函数。您的猜测是正确的 - 要调用它们,您将使用:

seqer.set_prefix('Q');
seqer.set_seq(1000);

顺便说一下,您的函数中还有另一个错误:

var serial_maker = function () {
        ...
        return {
            ...
        };
    }(); // <- right here

您正在定义一个匿名函数,但会立即调用它。所以不幸的是,var serial_maker不会是一个serial_maker - 它将是返回的对象。当然,后续var seqer = serial_maker();会失败,因为对象不是函数。

set_prefixset_seq是方法。要使用它们,请按以下方式执行此操作:

var seqer = serial_maker();
seqer.set_prefix('Q');
seqer.set_seq(1000);
seqer.gensym();

此外,要创建serial_maker()"模块",您需要拥有这些模块来创建它。

var serial_maker = (function () {
    //code here
}());
//or
var serial_maker = (function () {
    //code here
})();