Верно ли, что замыкание создается в следующих случаях для foo
, но не для bar
?
Случай 1:
<script type="text/javascript">
function foo() { }
</script>
foo
- это замыкание с цепочкой областей видимости только с глобальной областью.
Случай 2:
<script type="text/javascript">
var i = 1;
function foo() { return i; }
</script>
аналогично случаю 1.
Случай 3:
<script type="text/javascript">
function Circle(r) {
this.r = r;
}
Circle.prototype.foo = function() { return 3.1415 * this.r * this.r }
</script>
в этом случае Circle.prototype.foo
(который возвращает область круга) относится к закрытию только с глобальной областью. (это замыкание создается).
Случай 4:
<script type="text/javascript">
function foo() {
function bar() {
}
}
</script>
здесь foo
является закрытием только с глобальной областью, но bar
не является закрытием (пока), потому что функция foo
не вызывается в коде, поэтому закрытие bar
никогда создано. Он будет существовать только в том случае, если вызывается foo
, а замыкание bar
будет существовать до тех пор, пока foo
не вернется, а закрытие bar
будет собрано в мусор, поскольку ссылки на него вообще нет.
Итак, когда функция не существует, нельзя вызвать, на которую нельзя ссылаться, тогда закрытие еще не существует (еще не создано). Только когда функция может быть вызвана или может быть указана, тогда фактически создается замыкание?