包装器函数的参数如何在关键字'return'之后传递给函数?
function greeting(name){
console.log("Hello, " + name)
}
function wrapper(f){
return function(args){
if(typeof(f)==='function'){
console.log("before executing wrapped")
f(args)
console.log("after executing wrapped")
}
else{
return f
}
}
}
let a = wrapper(greeting)
a("Maria")
那么,这工作得很好,并打印预期的
before executing wrapped
Hello, Maria
after executing wrapped
,因为f
的参数被传递到return function(args){
行。然而,如果我在那里没有return
关键字,那么f
的参数就不会被传递给匿名函数。这是怎么发生的?
类似代码的非工作版本示例(仅更改了包装器函数):
function greeting(name){
console.log("Hello, " + name)
}
function wrapper(f){
if(typeof(f)==='function'){
function a (args){
console.log("before executing wrapped")
f(args)
console.log("after executing wrapped")
}
return a(args)
}
else{
return f
}
}
let a = wrapper(greeting)
a('Maria')
当然,这返回ReferenceError: args is not defined
。
我很想知道return
关键字是怎么回事,它使第一段代码工作。
如何将args
与'Maria'识别?
将function wrapper
中的匿名函数命名为func1
;所以代码等于:
function wrapper(f){
function func1(args) {
// do someting
}
return func1
}
let a = wrapper(greeting)
,实际上a
是func1
;
调用a("Maria")
和调用func1("Maria")
一样,因为a
是func1
。所以"Maria"作为变量args
传递给func1
。
使第二个代码工作
在第二段代码中返回一个函数(不是函数调用)。
function greeting(name){
console.log("Hello, " + name)
}
function wrapper(f){
if(typeof(f)==='function'){
function a (args){
console.log("before executing wrapped")
f(args)
console.log("after executing wrapped")
}
return a // <--- change at here
}
else{
return f
}
}
let a = wrapper(greeting)
a('Maria')
实际上,这些文字是等价的:
function wrapper(f){
return function(args){
if(typeof(f)==='function'){
console.log("before executing wrapped")
f(args)
console.log("after executing wrapped")
}
else{
return f
}
}
}
function wrapper(f){
function a(args){
if(typeof(f)==='function'){
console.log("before executing wrapped")
f(args)
console.log("after executing wrapped")
}
else{
return f
}
}
return a
}
function wrapper(f){
if(typeof(f)==='function'){
function a (args){
console.log("before executing wrapped")
f(args)
console.log("after executing wrapped")
}
return a
}
else{
return f
}
}
function wrapper(f){
if(typeof(f)==='function'){
return function (args){
console.log("before executing wrapped")
f(args)
console.log("after executing wrapped")
}
}
else{
return f
}
}