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,它是函数中间件的局部变量,因此调用者函数不应该能够识别它。
答案 0 :(得分:1)
我还用这个内容更新了我原来问题的答案,但我也把它放在这里。
原因是它可以通过闭包来实现,为简化起见,它使封闭范围的变量可用于封闭的范围。令人难以置信的强大功能,也很容易出现一些意想不到的行为 - 内部函数关闭错误地访问外部循环变量(当他们真的只想在特定时间点访问循环计数器的值时)是一个非常常见的来源有些头疼。您可以在Stack Overflow上找到关于闭包的一些非常好的描述。 This question很好地涵盖了闭包。我还推荐Douglas Crockford的Javscript:The Good Parts,以涵盖许多Javascript的特征细微差别。