JS参数传递给"return"关键字之后定义的函数。这是如何工作的?



包装器函数的参数如何在关键字'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),实际上afunc1;

调用a("Maria")和调用func1("Maria")一样,因为afunc1。所以"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
}  
}

相关内容

  • 没有找到相关文章

最新更新