мой вопрос касается следующего примера:
function inner(x){
return x;
}
function outer(fn){
var x = 'I just made a closure!!!'
return fn.bind(this, x)
}
var y = outer(inner)
y()
когда y()
вызывается, имеет ли он замыкание по x
из-за bind
? Я запутался, потому что у него есть доступ к внутренней переменной outer
функции, но она тем не менее объявлена вне сферы outer
когда y() вызывается, имеет ли он замыкание по x из-за связывания?
Нет, вызов bind
для функции возвращает связанную функцию. Однако эта связанная функция может закрывать функцию и аргументы, но это зависит от реализации. Реализация с закрытием будет выглядеть так:
Function.prototype.bind = function(context, ...args) {
const bound = this;
return function(...args2) { // the closure
bound.call(context, ...args, ...args2);
};
};
когда y() вызывается, имеет ли он замыкание по x из-за связывания?
Не совсем.
Значение x
передается как аргумент для bind
.
Рассмотрим это грубое приближение того, как может выглядеть реализация функции bind
:
function bind(this_value, first_argument_value) {
return function () {
// Call the original function with arguments and context
}
}
Это first_argument_value
, которое закрывается, а не x
.