Закрытие в JavaScript со встроенной функцией - PullRequest
0 голосов
/ 27 января 2020

Допустим, я определил функцию типа

var f = function(cb){cb()};

Теперь, если я передам функцию обратного вызова, она будет работать:

f(()=>{console.log("ccb")}); //print: ccb

Но если я передам аргумент, в этом случае x будет неопределенным:

f((x)=>{console.log("x:"+x);}); // x will be undefined

, поэтому одним из решений является использование замыкания,

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

f(cba(20)); //will work give output: ccbbaa:20

Но если я пытаюсь добиться закрытия с помощью функции inplace, учитывая, что xx определен.

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

обратный вызов внутри f даже не вызывается. Почему? Как мы можем использовать эту встроенную функцию, чтобы она работала? Я изучаю замыкания, поэтому хотел понять это. Любая помощь приветствуется.

Ответы [ 4 ]

2 голосов
/ 27 января 2020

В вашем коде вы не вызываете встроенную функцию с помощью xx. Вы просто передаете встроенную функцию в f, которая будет ее выполнять, но она ничего не напечатает, потому что вызываемая встроенная функция просто возвращает другую функцию, которая затем никогда не вызывается.

var f = function(cb){cb()};
var xx = 20;
f((function(xx){
    return function(){
        console.log("xxx: "+xx)
    }
})(xx));
0 голосов
/ 27 января 2020

встроенная функция возвращает другую функцию, которая никогда не вызывается.

 var f = function(cb){cb()};
    var xx = 20;
    f((function(xx){
        return function(){
            console.log("xxx: "+xx)
        }
    })(xx));
0 голосов
/ 27 января 2020

Единственный способ заставить эту работу - дать анонимной функции значение по умолчанию для xx

f(function(xx=20){
    (function(){
        console.log("xxx: "+xx)
    })(xx);
});
0 голосов
/ 27 января 2020

Используйте bind для привязки параметра:

const f = function(x){x()};
const param = 12

f(function(x){
    console.log("ccbbaa:"+x)
}.bind(null, param))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...