JavaScript中带有内联函数的闭包

JavaScript中带有内联函数的闭包,javascript,scope,closures,Javascript,Scope,Closures,比方说,我定义了一个函数,比如 var f=函数(cb){cb()} 现在,如果我传递一个回调函数,它将工作: f(()=>{console.log(“ccb”)})//打印:ccb 但如果我传递一个参数,在这种情况下x将是未定义的: f((x)=>{console.log(“x:+x);});//x将是未定义的 所以一个解决方案是使用闭包 function cba(x){ return function(){ console.log("ccbbaa:"+x)

比方说,我定义了一个函数,比如

var f=函数(cb){cb()}

现在,如果我传递一个回调函数,它将工作:

f(()=>{console.log(“ccb”)})//打印:ccb

但如果我传递一个参数,在这种情况下x将是未定义的:

f((x)=>{console.log(“x:+x);});//x将是未定义的

所以一个解决方案是使用闭包

function cba(x){
      return function(){
        console.log("ccbbaa:"+x)
      }
}

f(cba(20)); //will work give output: ccbbaa:20
但如果我试图使用内插函数来实现闭包,那么考虑到xx是定义的

var xx = 20;
f(function(xx){
    return function(){
        console.log("xxx: "+xx)
    }
});

甚至不调用f内部的回调。
为什么?我们将如何使用此内联函数使其工作?我正在学习闭包,所以我想了解这一点。非常感谢您的帮助。

在代码中,您没有使用
xx
调用内联函数。您只是将内联函数传递给
f
,该函数将被执行,但不会打印任何内容,因为被调用的内联函数只返回另一个函数,而该函数将永远不会被调用

 var f = function(cb){cb()};
    var xx = 20;
    f((function(xx){
        return function(){
            console.log("xxx: "+xx)
        }
    })(xx));
var f=函数(cb){cb()};
var xx=20;
f((函数(xx){
返回函数(){
控制台日志(“xxx:+xx”)
}

})(二十);在代码中,您没有使用
xx
调用内联函数。您只是将内联函数传递给
f
,该函数将被执行,但不会打印任何内容,因为被调用的内联函数只返回另一个函数,而该函数将永远不会被调用

 var f = function(cb){cb()};
    var xx = 20;
    f((function(xx){
        return function(){
            console.log("xxx: "+xx)
        }
    })(xx));
var f=函数(cb){cb()};
var xx=20;
f((函数(xx){
返回函数(){
控制台日志(“xxx:+xx”)
}

})(二十);使用
bind
绑定参数:

const f=function(x){x()};
常数参数=12
f(函数(x){
控制台日志(“ccbbaa:+x)

}.bind(null,param))
使用
bind
绑定参数:

const f=function(x){x()};
常数参数=12
f(函数(x){
控制台日志(“ccbbaa:+x)

}.bind(null,param))
实现此功能的唯一方法是为匿名函数指定xx的默认值

f(function(xx=20){
    (function(){
        console.log("xxx: "+xx)
    })(xx);
});

实现此功能的唯一方法是为匿名函数指定xx的默认值

f(function(xx=20){
    (function(){
        console.log("xxx: "+xx)
    })(xx);
});

内联函数返回另一个从未调用过的函数

 var f = function(cb){cb()};
    var xx = 20;
    f((function(xx){
        return function(){
            console.log("xxx: "+xx)
        }
    })(xx));

内联函数返回另一个从未调用过的函数

 var f = function(cb){cb()};
    var xx = 20;
    f((function(xx){
        return function(){
            console.log("xxx: "+xx)
        }
    })(xx));

执行带有签名的外部函数
function(xx)
,该函数返回带有签名的新函数
function()
,但从不执行后者。因为它也从未返回,所以以后也不能调用它。它只是被生成,并在某个时候被垃圾收集。“f中的回调甚至没有被调用。为什么?”-因为您没有做任何调用它的事情
f()
对调用传递给它的函数得到的返回值没有任何作用。@Quentin我们如何更改它以使其工作?@NikhilKumar-你为一个没有真正明确定义的问题制定了一个非常抽象和不完整的解决方案。很难说如何解决实际问题,因为我们不知道它是什么。你似乎只是想做一些事情,
f
根本就不是设计来做的,而是通过更改传递给
f
的内容来实现它……但是无论你传递给
f
什么,它都不会改变
f
的工作方式。你用签名
函数(xx)执行外部函数
返回一个带有签名的新函数
function()
,但您永远不会执行后者。因为它也从未返回,所以以后也不能调用它。它只是被生成,并在某个时候被垃圾收集。“f中的回调甚至没有被调用。为什么?”-因为您没有做任何调用它的事情
f()
对调用传递给它的函数得到的返回值没有任何作用。@Quentin我们如何更改它以使其工作?@NikhilKumar-你为一个没有真正明确定义的问题制定了一个非常抽象和不完整的解决方案。很难说如何解决实际问题,因为我们不知道它是什么。你似乎只是想做一些事情,
f
根本不是设计来做的,而是通过改变你传递给
f
的内容来接近它……但不管你传递给
f
什么,它都不会改变
f
的工作方式。感谢你的快速响应,并为天真的问题感到抱歉,但按照这个逻辑,为什么f(cba(20));worked@NikhilKumar因为您执行
cba
,然后返回一个(单级)函数。如果您有
(函数(xx){return function(){console.log(“xxx:+xx)}})(xx)
,则会发生完全相同的情况-您有一个执行的函数并返回一个(单级)函数。唯一的区别是,在后一种情况下,你有,但没有什么是真正的根本不同-你得到相同的结果,无论哪种方式。@VLAZ哦,现在明白了,谢谢。想知道在这种情况下如何使用arrow函数,比如`f((xx)=>{return function(){console.log(“xxx:+xx)}}}(xx));`。是吗?@NikhilKumar是的,这在语法上是可行的。但问题是你为什么想要生活?与使用普通函数相比,它没有任何好处。如果需要,可以使用部分应用程序预先设置函数期望的参数。有了这个(以及其他技术,比如currying),你可以使用一个普通的函数来获取参数,并生成本质上不需要参数但可以稍后执行的函数;worked@NikhilKumar因为您执行
cba
,然后返回一个(单级)函数。如果您有
(函数(xx){return function(){console.log(“xxx:+xx)}})(xx)
,则会发生完全相同的情况-您有一个执行的函数并返回一个(单级)函数。唯一的区别是,在后一种情况下,你有,但没有什么是真正的根本不同-你