【问题标题】:How to access JavaScript function which is in function which is in function如何访问函数中的JavaScript函数
【发布时间】:2017-10-05 11:52:51
【问题描述】:

有什么方法可以访问一个函数内的函数,而该函数在 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

【问题讨论】:

  • 您的用例是什么?对我来说,这似乎不清楚,为什么需要这个?在顶层声明函数并且不要打扰嵌套,除非绝对没有办法绕过这个 terribad(无冒犯)模式。我认为你不是在解释你的问题,而是你的解决方案的问题。也许如果我们知道这背后的想法,我们可以给你一个更好的选择。

标签: javascript function this


【解决方案1】:

你可以的

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 关键字)时,它的 this 绑定到正在构造的新对象。所以如果你想在函数 a() 中调用 this,你必须使用 new 关键字创建一个构造函数

【讨论】:

  • 这读起来更像是一个发现不同的游戏,而不是一个答案。你改变了什么?为什么要解决问题?
  • xobj.a() 返回一个字符串"a"
  • 不,它不会,由于 new 运算符,它会返回一个 this 的实例
  • 虽然可行,但这种编码方式并不能帮助任何人(包括未来的你)阅读您的代码。它并没有使它更清晰或更干净,而是比它应该的更混乱和更复杂。当然,我不能确定这一点,因为问题中没有给出完整的上下文。至少为“提供方法”竖起大拇指:)
  • 也很想知道,这是否是一种好的做法,以及这种情况是否在 javascript 的默认对象中实现
【解决方案2】:

我的建议是避免这种情况以及避免使用@marvel308's answer。我当然不喜欢用户:) 我只是不喜欢链接答案提供的可读性和可理解性,尽管付出了很大的努力。虽然它可能是一种解决方案,但您可能每次看到它使用它时都必须在 Google 上搜索,因为它不容易理解 - 让我们避免这种情况。

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

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

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"

我不能确定这段代码的可用性,因为用例太不清楚了,但是通过这种方式,你可以保持意图清晰,你可以随时使用函数参数来传递你的函数需要的任何数据(比如person在这种情况下的论点。)。

如果您像其他所有 JS 开发人员一样讨厌污染全局命名空间,请将与 x(在我的示例中为 Person)相关的所有函数 直接 包装在其中,而不是嵌套更深1级。例如

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)相关的所有函数。

他们可以在没有这些疯狂的嵌套结构的情况下轻松调用实例中的其他函数属性。也无需添加参数,因为您是从 那个 实例调用函数(当然,这将根据您的需要而改变)。

作为额外的好处,您不再需要您所要求的,因为您现在只需使用 me2.somefunction() 访问该功能,而不必深入挖掘。

希望我能提供帮助;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多