Не существует автономной функции с именем b
из лексической области MM.a
, поэтому вызов a()
из makeClosure
приводит к ошибке, поскольку внутри * не может быть найдена переменная или функция с именем b
.1006 * функция в MM
.
Одна из возможностей - передать a
функцию для выполнения, таким образом MM
не зависит от какой-либо внешней переменной:
let MM = {
a: function(someFn){
someFn();
},
b: function(){
console.log('b');
}
};
function makeClosure(M) {
let { a, b } = M;
function a2(){ b2() };
function b2(){ console.log('b2'); };
return function( arg ){
if ( arg === 1 ) a(b);
if ( arg === 2 ) a2();
}
}
let c = makeClosure( MM );
c(1);
c(2);
Другой вариант будет call
a
внутри makeClosure
с вызывающим контекстом объекта, обладающего свойством b
, как MM
и MM.a
звоните this.b
:
let MM = {
a: function(){
this.b();
},
b: function(){
console.log('b');
}
};
function makeClosure(M) {
let { a, b } = M;
function a2(){ b2() };
function b2(){ console.log('b2'); };
return function( arg ){
if ( arg === 1 ) a.call({ b });
if ( arg === 2 ) a2();
}
}
let c = makeClosure( MM );
c(1);
c(2);
Проблема не имеет ничего общего с деструктуризацией - это просто простые правила JS.