为什么oldFunc从调用函数中被引用,即使它是中间件中的局部变量

时间:2014-03-13 18:25:36

标签: node.js

var AwesomeClass = function() {
    this.awesomeProp = 'awesome!'
    this.awesomeFunc = function(text) {
        console.log(text + ' is awesome!')
    }
}
var awesomeObject = new AwesomeClass()
function middleware(func) {
   var oldFunc = func.awesomeFunc
    func.awesomeFunc = function(text) {
        text = text + ' really'
        oldFunc(text)

    }
}
function anotherMiddleware(func) {
    func.anotherProp = 'super duper'
}
function caller(input) {
    input.awesomeFunc(input.anotherProp)

}
middleware(awesomeObject)
anotherMiddleware(awesomeObject)
caller(awesomeObject)

在上面的代码中,您将看到调用函数是实际调用awesomeFunc的函数,但是当我们调用中间件函数时,我们更改了awesomeobject中的函数,并使oldFunc变量成为awesomeFunc的一部分。但是我不明白的是,当从调用函数内部调用awesomeFunc时,awesomeFunc是如何正确执行的?由于awesomeFunc现在在其中提到了oldFunc,它是函数中间件的局部变量,因此调用者函数不应该能够识别它。

1 个答案:

答案 0 :(得分:1)

我还用这个内容更新了我原来问题的答案,但我也把它放在这里。

原因是它可以通过闭包来实现,为简化起见,它使封闭范围的变量可用于封闭的范围。令人难以置信的强大功能,也很容易出现一些意想不到的行为 - 内部函数关闭错误地访问外部循环变量(当他们真的只想在特定时间点访问循环计数器的值时)是一个非常常见的来源有些头疼。您可以在Stack Overflow上找到关于闭包的一些非常好的描述。 This question很好地涵盖了闭包。我还推荐Douglas Crockford的Javscript:The Good Parts,以涵盖许多Javascript的特征细微差别。