我是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是中间件函数的局部变量,但我仍然可以从另一个函数调用它,即调用函数........... ..怎么样!!
答案 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的许多功能细微差别。