我正在研究一些JavaScript代码,它通过定义原型对象来定义一些类方法,如下所示:
/**
* @constructor
*/
function MyClass() {
var someField = 'hello world';
}
MyClass.prototype = {
getSomeField1: function getSomeField2() {
return someField;
}
};
我有两个问题:
什么是getSomeField2
,任何代码都可以访问它?
任何人都可以举例说明使用不同名称作为密钥和功能名称可能有利的方案吗?我原本以为这会让人误解阅读代码。
在类似代码的所有其他实例中,属性和函数名称匹配,或者函数未命名。
答案 0 :(得分:1)
主要好处是所有浏览器都会在堆栈跟踪中显示函数名称。
通常,人们在将属性或属性赋值给属性或变量时会使用匿名函数。 Chrome一直非常善于确定它应该在堆栈跟踪上使用属性或变量名称,但IE曾用于显示匿名。
同样命名的函数具有name
属性
(function a(){}).name // a
(function(){}).name // ""
答案 1 :(得分:1)
命名功能对调试很有用。例如,打印堆栈跟踪时,将显示名称getSomeField2
,而不是"匿名函数" 。它对于定义递归函数也很有用,因为函数调用自身没有其他明确的方法。在JS中引入named function expressions之前,如果函数想要调用自身是通过使用(相当丑陋和#34;禁止"自ES5)arguments.callee
方法。
因此,要回答您的问题,getSomeField2
绑定仅在函数体内可用,您可以按如下方式进行验证:
(function myFunctionName() {
console.log(`Inside: ${myFunctionName}`); // prints the function body
})();
console.log(`Outside: ${myFunctionName}`); // ReferenceError: myFunctionName is not defined