在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() {} vs function functionName() {}重复,则与function expression vs function declaration with regard to javascript 'classes'不重复。我的问题不是关于函数表达式和函数声明之间的区别,而是它们在javascript“类”中的“私有成员”方面的差异。
答案 0 :(得分:0)
更重要的是,它们不是私有方法(在JavaScript中不存在)。您创建的方法只能在构造函数中访问,极大地限制了它们的值。
答案 1 :(得分:0)
每次调用构造函数时,表达式显然会生成一个新函数。这是否发生在函数声明中以及[...]?
每次都可以通过任何一种方法生成一个新函数
因为函数声明是在分析时计算的
提升函数声明与提升var
d标识符的方式类似。这发生在调用
这两种[定义]方法的方式有何不同?
这与其他地方相同,你可以在定义行之前在行上引用函数声明(假设它在你的作用域中)
foo.bar; // undefined
function foo() {}
vs函数表达式尚未被提升,因此标识符foo
是可引用的,但您无法引用已分配给它的函数,直到之后
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 以表示&#34;外部可引用的&#34; <时,使用 public 和 private 这两个词/ em>和&#34;分别不是外部可引用的&#34; 同样地,实际上并没有 Class 这样的东西(即使在 ES 6 中,它只是我们已经在 ES 中所做的语法糖em> ES 5 )。相反,我们有构造函数和原型链。
答案 2 :(得分:0)
主要区别是
函数声明在它的封闭范围内得到提升
var Klass = function() {
return {
publicMethod: privateMethod
};
function privateMethod() {
}
}
你可以在返回的下面引用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();
}
}