为什么oldFunc会从调用函数中被引用

时间:2014-03-13 17:45:28

标签: node.js

我是Node.js的新手,我正在尝试运行这个简单的程序:

var AwesomeClass = function() {
    this.awesomeProp = 'awesome!'
    this.awesomeFunc = function(text) {
        console.log(text + ' is awesome!')
    }
}
var awesomeObject = new AwesomeClass()
function middleware(func) {
    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)
    oldFunc("John");
}
middleware(awesomeObject)
anotherMiddleware(awesomeObject)
caller(awesomeObject)

上面的代码运行得很好..但我不明白的是oldFunc是中间件函数的局部变量,但我仍然可以从另一个函数调用它,即调用函数........... ..怎么样!!

1 个答案:

答案 0 :(得分:1)

我认为缺少var关键字意味着oldFunc被附加到全局命名空间。

如果你改变了

oldFunc = func.awesomeFunc

var oldFunc = func.awesomeFunc

我认为您将无法访问。

您可能会感兴趣this war story

在评论

中更新以回答您的问题

鉴于以下代码,您问及为什么func.awesomeFunc仍然可以从其封闭函数访问本地var oldFunc

function middleware(func) {
    var oldFunc = func.awesomeFunc
    func.awesomeFunc = function(text) {
        text = text + ' really' oldFunc(text)
    }
}
function caller(input) {
    input.awesomeFunc(input.anotherProp)
}

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