在 Javascript 中使用模块模式调用内部函数的正确方法是什么

tim*_*dit 2 javascript

我对 Javascript 很陌生,并且仍在研究创建对象的各种方法,即构造函数+new、原型、函数和部件。

我已经使用模块模式创建了一个对象工厂,并且想知道调用内部方法的正确方法是什么。是通过this还是函数名

这是我的模块:

function chart() {
    function my() {
        // generate chart here, using `width` and `height`
    }

    my.sayHi = function(){
        console.log('hi');
        my.sayBye();
    };

    my.sayBye = function(){
        console.log('Bye');
    };

    return my;
    }

var test = chart();
test.sayHi();
Run Code Online (Sandbox Code Playgroud)

您可以看到第一个函数使用my.sayBye()调用第二个函数,或者使用this.sayBye()更好。两者产生相同的结果并且运行没有错误。

Ara*_*and 5

如果需要,模块模式允许您省去“this”变量。我可能会重写上面的代码,看起来像这样,然后问题就变得毫无意义了。

function chart() {
    var hiCount = 0;

    function sayHi(){
        console.log('hi');
        hiCount++;
        sayBye();
    };

    function sayBye(){
        console.log('Bye');
    };

    return {
       sayHi : sayHi,
       sayBye: sayBye
    };
}

var test = chart();
test.sayHi();
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,所有内容都在函数内定义chart。由于 JavaScript 的作用域是函数级别,因此每次chart调用函数时都会定义一组新函数。并且还可以定义一组新的变量,这些变量是函数私有的,因为它们是在函数中定义的,并且不能从外部访问。我添加了hiCount一个示例来说明如何执行此操作。模块模式允许 JavaScript 中的隐私。它比原型模式消耗更多的内存,尽管每次声明一个函数时,它不会在同一类的其他实例之间共享。这就是在 Javascript 中为了拥有私有类变量而必须付出的代价。我心甘情愿地付钱。从我的代码中删除“this”可以使其更容易理解,并且不太可能陷入范围错误的问题。