如何访问功能正常的JavaScript函数

时间:2017-10-05 11:52:52

标签: javascript function this

有没有办法访问函数内部的函数,该函数位于JavaScript的其他函数中?



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


  this.a = function() {
    this.b = function() {
      return "b";
    };

    return "a";
  };
}

var xobj = new x('vin', 25);
console.log(xobj.a.b()); //error




2 个答案:

答案 0 :(得分:2)

你可以做到

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

 this.a = function(){
			
		this.b = function(){
			return "b";
        };

	return "a";
  };
  
}


var xobj =new x('vin',25);
var xx = new xobj.a();
console.log(xx.b());

您必须声明x.a()的实例,然后调用b

当函数用作构造函数(使用new关键字)时,它将绑定到正在构造的新对象。所以如果你想在函数a()中调用它,你必须使用new关键字

创建一个构造函数

答案 1 :(得分:0)

我的建议是避免这种情况并避免使用@marvel308's answer。我当然不喜欢用户:)我只是不喜欢链接的答案提供的可读性和可理解性,尽管努力。虽然它可能是一个解决方案,但是每次看到它时都可能需要谷歌,因为它不容易理解 - 让我们避免这样做。

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

现在,如果嵌套不是 绝对需要,那么您可以使用顶层定义的多个函数来选择更简单的解决方案:< / p>

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"

我无法确定此代码的可用性,因为用例太不明确但是这样,你保持意图清晰,你总是可以使用函数参数传入你的函数需要的任何数据(如{{1在这种情况下,参数。)。

如果您和其他所有讨厌全局命名空间的JS开发人员一样,请将与person(我的示例中为x)相关的所有函数包含在直接中。嵌套深度超过1级。 e.g。

Person

行动中:

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 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访问该功能而不必深入挖掘。

希望我可以提供帮助;)