JS:函数表达式的函数与方法有什么区别?

JS: what's the difference between function vs method on function expressions?

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

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

示例 A - 我声明函数 func() 并且 return 仅 method/function 名称。

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

    function bye() {
        return 'bye';
    }

    function hello() {
        return hi;
    }

    return {
        hello: hello
    }
}();

示例 B - 这里我声明 foo = function() 和 return 只有 method/function 名称。

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

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

    var hello = function() {
        return hi;
    }

    return {
        hello: hello
    }
}();

示例 C - 这里我在 return

中声明 foo = function()
var funcC = function() {
    var hi = "hello";

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

    return {
        hello: function() {
            return hi;
        }
    }
}();

示例 D - 与上一个相同,但所有函数都包含在 ().

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

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

    return {
        hello: function() {
            return hi;
        }
    }
})();

在每种情况下,如果我想调用 hello(),我只写 funcX.hello() 和所有 return "hello"

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

谢谢。

首先值得注意的是,从 byehello 中省略 var 关键字实际上会使它们成为全局的。

现在的区别:

var hello = function () {}

return {
  hello: hello
};

return {
  hello: function () {}
};

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

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

var myFunc = function () {}

function myFunc () {}

带有关键字 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() {}