Javascript 私有方法:函数表达式与函数声明[重复]

问题描述 投票:0回答:3

在 JavaScript 中创建(某种)私有方法的常见方法是:

Class = function (arg0, arg1) {
    var private_member = 0;
    var privateMethod = function () {
        return private_member;
    };
}

上面的示例也可以使用函数声明而不是函数表达式来完成:

Class = function (arg0, arg1) {
    var private_member = 0;
    function privateMethod () {
        return private_member;
    }
}

这两种声明私有方法的方式有什么不同? (除了一个是表达式,另一个是声明之外)

例如,每次调用构造函数时,表达式显然都会生成一个新函数。函数声明也会发生这种情况吗?还是因为函数声明在解析时求值,所以只求值一次? (与在执行时评估的函数表达式相反,您明白了。)

我知道 JavaScript 真的没有私有方法。我宽松地使用这个术语。

不是 var functionName = function() {} 与 function functionName() {} 的重复,如果有的话,是关于 javascript“类”的 函数表达式 vs 函数声明的重复。我的问题不是关于函数表达式和函数声明之间的一般差异,而是它们在 JavaScript“类”中的“私有成员”方面的差异。

javascript
3个回答
1
投票
每次调用构造函数时,表达式显然都会生成一个新函数。函数声明也会发生这种情况吗[...]?

任何一种方法每次都会生成一个新函数

因为函数声明是在解析时评估的

函数声明的提升方式与

var

d 标识符的提升方式类似。这发生在调用它们所在范围的开始时

这两种[定义]方法的方式有何不同?

这与其他地方相同,您可以在定义函数之前的行上引用函数声明(假设它在您的范围内)

foo.bar; // undefined function foo() {}

vs 函数表达式尚未提升,因此标识符

foo

 是可引用的,但您无法引用您将分配给它的 
function,直到之后

foo.bar; // TypeError: Cannot read property 'bar' of undefined var foo = function () {}; // same as var foo; foo.bar; // TypeError: Cannot read property 'bar' of undefined foo = function () {};


请确保您了解

JavaScript与经典编程语言不同;传统程序员在谈论 JavaScript 时使用词 publicprivate 分别表示 “外部可引用”“不可外部引用”。 同样,实际上并不存在Class
这样的东西(即使在ES 6中,它也只是我们在ES 5中所做的事情的语法糖)。相反,我们有构造函数原型链


0
投票
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions#Function_constructor_vs._function_declaration_vs._function_expression

更重要的是,它们不是私有方法(JavaScript 中不存在私有方法)。您创建的方法只能在构造函数内部访问,极大地限制了它们的价值。


0
投票

函数声明在其封闭范围内得到提升让我们说

var Klass = function() { return { publicMethod: privateMethod }; function privateMethod() { } }

你可以在return下面引用privateMethod,因为privateMethod会在函数Klass中被提升,但你不能用函数表达式来做到这一点

var Klass = function() { return { publicMethod: privateMethod // privateMethod will be undefined }; var privateMethod = function () { } }

你不能用所说的函数表达式引用方法的名称

var method = function() { if(somecondition) { method(); } }

你必须给它一个名字,总是首选命名方法

var method = function method() { if(somecondition) { method(); } }

© www.soinside.com 2019 - 2024. All rights reserved.