Javascript JS:what';函数和方法在函数表达式上的区别是什么?

Javascript JS:what';函数和方法在函数表达式上的区别是什么?,javascript,methods,dry,module-pattern,Javascript,Methods,Dry,Module Pattern,最近我一直在学习JS模块模式,我已经看到了至少3-4种创建具有公共和私有属性的函数表达式的方法。我的问题是我不明白它们之间的最大区别是什么,最佳方法/最佳实践是什么 下面4个示例的语法不同,但它们的调用方式相同。你能解释一下他们之间的区别吗 示例A-我声明函数func(),只返回方法/函数名 var funcA = function() { var hi = "hello"; function bye() { return 'bye'; } f

最近我一直在学习JS模块模式,我已经看到了至少3-4种创建具有公共和私有属性的函数表达式的方法。我的问题是我不明白它们之间的最大区别是什么,最佳方法/最佳实践是什么

下面4个示例的语法不同,但它们的调用方式相同。你能解释一下他们之间的区别吗

示例A-我声明函数func(),只返回方法/函数名

var funcA = function() {
    var hi = "hello";

    function bye() {
        return 'bye';
    }

    function hello() {
        return hi;
    }

    return {
        hello: hello
    }
}();
var funcB = function() {
    var hi = "hello";

    var bye = function() {
        return 'bye';
    }

    var hello = function() {
        return hi;
    }

    return {
        hello: hello
    }
}();
示例B—这里我声明foo=function(),只返回方法/函数名

var funcA = function() {
    var hi = "hello";

    function bye() {
        return 'bye';
    }

    function hello() {
        return hi;
    }

    return {
        hello: hello
    }
}();
var funcB = function() {
    var hi = "hello";

    var bye = function() {
        return 'bye';
    }

    var hello = function() {
        return hi;
    }

    return {
        hello: hello
    }
}();
示例C-这里我在返回中声明foo=function()

var funcC = function() {
    var hi = "hello";

    var bye = function() {
        return 'bye';
    }

    return {
        hello: function() {
            return hi;
        }
    }
}();
示例D-与prev相同,但所有函数都包装在
()

在每种情况下,如果我想调用hello(),我只需编写
funcX.hello()
,它们都返回
“hello”

但它们都是通过不同的方式创造出来的。正确的是什么?如果有正确的方法


谢谢。

首先值得注意的是,在
bye
hello
中省略var关键字实际上会使它们具有全局性

现在,我们来看看两者之间的区别:

var hello = function () {}

return {
  hello: hello
};

是none,因为您只是以任意方式传递函数。将函数存储在变量中有一个优点,即可以在范围中的其他位置使用它

现在需要注意的一个区别是声明函数

var myFunc = function () {}
vs

带有关键字infront的会立即进入范围,因此在您到达声明之前,它们是可用的。对于var,情况并非如此。比如说

function a() {
  b();
}

a();

var b = function () {
  console.log('hi')
}
调用a时,它将抛出一个错误,因为未定义b。如果你这样做:

function a() {
  b();
}

a();

function b() {
  console.log('hi')
}

它会很好用的。这就是所谓的吊装。第一个被称为函数表达式
var thing=function(){}
,其中最后一个被称为函数声明
function thing(){}

bye
没有声明,所以它是全局的。它们之间没有太大的区别,在一些示例中,您没有使用
var
来声明
bye
hello
,因此它们成为全局变量。如果你修正了这一点,它们在所有意图和目的上都是等价的。示例中缺少var。值得注意的是,JavaScript中没有“方法”,只有作为对象属性的函数。它不像Java中那样有特殊的地位,它是另一个属性,它的值是一个函数。如果您关心性能,请对其进行基准测试。不,你不会注意到任何明显的区别。谢谢你的解释。我唯一关心的是最佳实践/性能,按照您所说的,没有问题。我通常遵循funcA()结构,所以我认为我做得对:)老实说,这取决于偏好。我发现,在我参与的各种项目上,以及在不同的公司之间,情况都有所不同。一旦你开始接触到更多新奇的东西,看看你的编辑器中可能包含的内容。这不是一个官方标准,但我们已经尝试在工作中采用它来保持事情的一致性。
function a() {
  b();
}

a();

function b() {
  console.log('hi')
}