在 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“类”中的“私有成员”方面的差异。
每次调用构造函数时,表达式显然都会生成一个新函数。函数声明也会发生这种情况吗[...]?任何一种方法每次都会生成一个新函数
因为函数声明是在解析时评估的函数声明的提升方式与
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 时使用词 public 和 private 分别表示 “外部可引用” 和 “不可外部引用”。
同样,实际上并不存在Class
这样的东西(即使在ES 6中,它也只是我们在ES 5中所做的事情的语法糖)。相反,我们有构造函数和原型链。
函数声明在其封闭范围内得到提升让我们说
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();
}
}