【问题标题】:Scoping function within function - Javascript函数内的范围函数 - Javascript
【发布时间】:2014-02-23 10:03:56
【问题描述】:

我有以下功能:

var Setup = function() {
    var that = this;
    this.x = 60;

    Setup.prototype.Loop = function() {
        console.log(this.x); // 1: returns 'undefined'
        console.log(Setup.x); // 2: returns 'undefined'
        console.log(hi.x); // 3: returns '60'
        console.log(that.x); // 4: returns '60'
    }
}

var hi = new Setup();

我想知道从Setup.prototype.Loop 函数访问this.x 构造函数的正确 方法是什么?

我尝试了四种方法(见上文):只有第三行和第四行给了我想要的结果。诚然,行号。 3 不是最好的方法,因为它依赖于对象hi。行号4 似乎是我能想到的最好的东西。

我得到了它的工作,但我正在努力学习最好的做事方式。有没有其他方法或更好的方法来做到这一点?

另外,我想这是一个以前必须问过的问题,但不知何故我找不到找到问题的词。另外,如果我在这里和那里使用了一些错误的术语,请原谅我。

感谢您的回复!

【问题讨论】:

  • 4.方法是要走的路,通过使用 hi 你正在访问槽实例而不是父闭包(那个)。
  • 根本不应该有任何输出,因为你从不调用Loop。一个问题是 Loop 是作为函数而不是构造函数调用的,所以它不应该以大写 L 开头。另一个是你在构造函数体中设置了原型函数,这意味着你不知道共享原型对象和在构造函数主体中运行的特定于实例的代码之间的区别。或许下面的答案可以帮到你:stackoverflow.com/a/16063711/1641941Prototype 不是那么容易理解,有什么不明白的欢迎追问。
  • @HMR - 我确实不太了解原型,您链接到的帖子是关于 SO 的最佳书面答案之一。非常感谢。
  • 谢谢你,它在编写它时帮助了我,并尝试改进答案帮助我更好地理解这一点。

标签: javascript function scope this


【解决方案1】:

通常应该在构造函数之外定义原型函数,this.x 是访问变量的正确方法。

var Setup = function() {
    this.x = 60;
};

Setup.prototype.Loop = function() {
    console.log(this.x);
};

(new Setup()).Loop();    // 60

【讨论】:

    【解决方案2】:

    原型应在构造函数之外设置,以便在您创建新实例时可用。

    var Setup = function () {
        var that = this;
        this.x = 60;
    }
    
    Setup.prototype.Loop = function () {
        console.log(this.x); // 1: returns 'undefined'
        console.log(Setup.x); // 2: returns 'undefined'
        console.log(hi.x); // 3: returns '60'
        console.log(that.x); // 4: returns '60'
    }
    
    var hi = new Setup();
    

    【讨论】:

    • 感谢@dfsq - 但是,我发现它嵌套了,就像我在其他人的演示代码中所做的那样。无论如何,在构造函数之外设置原型和像我一样嵌套它有什么主要区别吗?
    猜你喜欢
    • 2011-02-13
    • 2017-01-20
    • 2011-11-15
    • 1970-01-01
    • 2012-04-19
    • 2012-06-06
    • 2011-06-12
    • 1970-01-01
    相关资源
    最近更新 更多