Javascript 私有方法:函数表达式与函数声明
Javascript private methods: function expression vs function declaration
在 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() {}, if anything a duplicate of function expression vs function declaration with regard to javascript 'classes' 的副本。我的问题不是一般的函数表达式和函数声明之间的区别,而是它们在 javascript "classes".
中 "private members" 的具体区别
更重要的是,它们不是私有方法(JavaScript 中不存在)。您创建的方法只能在构造函数内部访问,极大地限制了它们的价值。
the expression obviously generates a new function everytime the constructor gets called. Does this happen with the function declaration aswell [...]?
无论哪种方式,每次都会生成一个新函数
because function declarations are evaluated at parse time
函数声明的提升方式与 var
d 标识符的提升方式类似。这发生在他们所在范围的调用开始时
In what ways are these two ways of [defining a] method different?
这与其他地方相同,您可以在定义行之前的行上引用函数声明(假设它在您的范围内)
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 与经典编程语言不同; public 和 private 这两个词被经典程序员在谈论 JavaScript[=41 时使用=]分别表示"externally Referenceable"和"not externally Referenceable"。
同样,实际上并没有 Class 这样的东西(即使在 ES 6 中,它只是我们的语法糖已经在 ES 5 中完成了)。相反,我们有构造函数和原型链。
主要区别是
函数声明在它的封闭范围内得到提升让我们说
var Klass = function() {
return {
publicMethod: privateMethod
};
function privateMethod() {
}
}
你可以在return下面引用privateMethod,因为privateMethod会在函数Klass中被提升,但是你不能用function expression
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();
}
}
在 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() {}, if anything a duplicate of function expression vs function declaration with regard to javascript 'classes' 的副本。我的问题不是一般的函数表达式和函数声明之间的区别,而是它们在 javascript "classes".
中 "private members" 的具体区别更重要的是,它们不是私有方法(JavaScript 中不存在)。您创建的方法只能在构造函数内部访问,极大地限制了它们的价值。
the expression obviously generates a new function everytime the constructor gets called. Does this happen with the function declaration aswell [...]?
无论哪种方式,每次都会生成一个新函数
because function declarations are evaluated at parse time
函数声明的提升方式与 var
d 标识符的提升方式类似。这发生在他们所在范围的调用开始时
In what ways are these two ways of [defining a] method different?
这与其他地方相同,您可以在定义行之前的行上引用函数声明(假设它在您的范围内)
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 与经典编程语言不同; public 和 private 这两个词被经典程序员在谈论 JavaScript[=41 时使用=]分别表示"externally Referenceable"和"not externally Referenceable"。
同样,实际上并没有 Class 这样的东西(即使在 ES 6 中,它只是我们的语法糖已经在 ES 5 中完成了)。相反,我们有构造函数和原型链。
主要区别是
函数声明在它的封闭范围内得到提升让我们说
var Klass = function() {
return {
publicMethod: privateMethod
};
function privateMethod() {
}
}
你可以在return下面引用privateMethod,因为privateMethod会在函数Klass中被提升,但是你不能用function expression
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();
}
}