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

时间:2016-11-22 14:47:51

标签: javascript methods dry module-pattern

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

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

示例A - 我声明函数func()并仅返回方法/函数名称。

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

    function bye() {
        return 'bye';
    }

    function hello() {
        return hi;
    }

    return {
        hello: hello
    }
}();

示例B - 这里我声明foo = 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 - 与prev相同,但所有功能都包含在()

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

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

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

在每种情况下,如果我想调用hello(),我只需编写funcX.hello()并且所有这些都返回"hello"

但所有这些都是通过不同的方式创造的。什么是正确的?如果有正确的方法。

感谢。

1 个答案:

答案 0 :(得分:3)

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

现在区别:

var hello = function () {}

return {
  hello: hello
};

并且

return {
  hello: function () {}
};

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

现在需要注意的一个区别就是宣布这个功能。

var myFunc = function () {}

VS

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() {}