如何访问函数中的JavaScript函数

如何访问函数中的JavaScript函数,javascript,function,this,Javascript,Function,This,在JavaScript中,有没有任何方法可以访问一个函数中的函数,也就是另一个函数中的函数 函数x(姓名、年龄){ this.name=名称; 这个。年龄=年龄; this.a=函数(){ this.b=函数(){ 返回“b”; }; 返回“a”; }; } var xobj=新x('vin',25); log(xobj.a.b())//错误您可以执行以下操作 函数x(姓名、年龄){ this.name=名称; 这个。年龄=年龄; this.a=函数(){ this.b=函数(){ 返回“b

在JavaScript中,有没有任何方法可以访问一个函数中的函数,也就是另一个函数中的函数

函数x(姓名、年龄){
this.name=名称;
这个。年龄=年龄;
this.a=函数(){
this.b=函数(){
返回“b”;
};
返回“a”;
};
}
var xobj=新x('vin',25);
log(xobj.a.b())//错误
您可以执行以下操作

函数x(姓名、年龄){
this.name=名称;
这个。年龄=年龄;
this.a=函数(){
this.b=函数(){
返回“b”;
};
返回“a”;
};
}
var xobj=新x('vin',25);
var xx=新的xobj.a();

console.log(xx.b())我的建议是避免这种情况,同时避免使用。当然,我并不讨厌用户:)我只是不喜欢链接答案提供的可读性和可理解性,尽管付出了很大的努力。虽然它可能是一个解决方案,但每次你看到它被使用时,你可能都要用谷歌搜索,因为它不容易理解——让我们避免这种情况

根据您的需要,有多种选择,例如,您可以重新考虑程序的结构,使其更加“扁平化”。 嵌套通常会使事情变得更复杂,所以避免嵌套在大多数情况下都会对你有好处

现在,如果嵌套不是绝对需要的,您可以选择这一更简单的解决方案,使用顶级定义的多个函数:

function Person(name, age) {
    this.name = name;
    this.age  = age;
}

function sayHelloToPerson(person) {
    console.log("Hello! " + person.name + ", it seems you are: " + person.age + " years old");
}
在行动中:

var me = new Person("SidOfc", 22);
sayHelloToPerson(me);
// => "Hello! SidOfc, it seems you are: 22 years old"
var me2 = new Person("SidOfc", 22);
me2.sayHello();
// => "Hello! SidOfc, it seems you are: 22 years old"
// since sayHello calls this.sayGoodbye() we also get:
// => "Goodbye! SidOfc"
我不能确定这段代码的可用性,因为用例太不清楚了,但通过这种方式,您可以保持意图清晰,并且始终可以使用函数参数来传递函数所需的任何数据(如本例中的
person
参数)

如果您像其他所有JS开发人员一样讨厌全局名称空间,请将与
x
Person
在我的示例中)相关的所有函数直接封装到中,而不是嵌套深度超过1级。e、 g

function Person(name, age) {
    this.name = name;
    this.age  = age;

    this.sayHello = function() {
        console.log("Hello! " + this.name + ", it seems you are: " + this.age + " years old");
        this.sayGoodbye();
    };

    this.sayGoodbye = function() {
        console.log("Goodbye! " + this.name);
    }
}
在行动中:

var me = new Person("SidOfc", 22);
sayHelloToPerson(me);
// => "Hello! SidOfc, it seems you are: 22 years old"
var me2 = new Person("SidOfc", 22);
me2.sayHello();
// => "Hello! SidOfc, it seems you are: 22 years old"
// since sayHello calls this.sayGoodbye() we also get:
// => "Goodbye! SidOfc"
这背后的想法是,在相同的嵌套级别上创建与
x
Person
)相关的所有函数

然后,他们可以轻松调用实例中的其他函数和属性,而无需这些疯狂的嵌套结构。也不必添加任何参数,因为您是从该实例调用函数的(当然,这将根据您的需要而改变)

作为额外的好处,你不再需要你想要的东西了,因为你现在可以使用
me2.somefunction()
访问函数,而不必深入挖掘


希望我能帮上忙;)

这读起来更像是一个不同点的游戏,而不是一个答案。你改变了什么?它为什么要解决这个问题呢?
xobj.a()
返回一个字符串
“a”
不,它不会,它会返回一个实例,因为新的操作符。虽然它可以工作,但这种编码方式不会帮助任何人(包括未来的你)阅读你的代码。它并没有使事情变得更清楚或更清楚,而是使事情变得更加混乱和复杂。当然,我不能肯定这一点,因为问题中没有给出完整的背景。至少对“提供一种方法”赞不绝口:)我也很想知道,这是否是一种好的实践,以及这个场景是否在JavaScription的默认对象中实现。您的用例是什么?对我来说这似乎不清楚,为什么一个人会需要这个?在顶层声明函数,不要麻烦嵌套,除非绝对没有办法绕过这个糟糕(无意冒犯)的模式。我想你不是在解释你的问题,而是在解释你解决问题的方法。也许如果我们知道这背后的想法,我们可以给你一个更好的选择。