Закрытие JavaScript против Java - PullRequest
       2

Закрытие JavaScript против Java

2 голосов
/ 05 октября 2011

Я изучаю javascript и наткнулся на следующий фрагмент кода:

var outerValue = true;

function outerFn(){
  assert( outerFn && outerValue, "These come from the closure." );
}

Поскольку я понимаю замыкания в вышеприведенном контексте, они позволяют externalFn фактически видеть переменную externalValue.

Мой вопрос: чем он отличается от любого другого языка программирования, например, например, Java? Ожидается, что область видимости externalValue позволит externalFn увидеть его.

добавлено позже:

    var outerValue = true;
    function outerFn() {
        console.log(outerValue);
    }

    function anotherFunction(arg){
        console.log("anotherFunction");
        arg.call(this);
    }

    anotherFunction(outerFn); 

Это лучший пример закрытия?

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

Понимать «clousures» как способность изменять объем выполнения функции или метода.Вот пример, где мы запускаем ту же функцию, изменяя область видимости для «client1», что «May», и client2, что «John».Это невозможно в Java.

<html>
<head>
    <script type="text/javascript" src="jquery-1.5.2.min.js"></script>
    <script type="text/javascript" >

    function assert(condition, message) {
        if (condition) {
            alert(message);
        }
    }

    function testClousures() {
        var client1 = {name: 'Mary', code: 123};
        var client2 = {name: 'John', code: 234};

        function outerFn(){ 
            assert( this.name == 'John', "These come from the closure." );
        }

        // Testing if client is John 
        outerFn.apply(client1);  // Fail
        outerFn.apply(client2);  // Success

    }

    function domReady() {
        $('#btn').click(function(){
            testClousures();
        });
    }
    </script>
</head>
<body onload="domReady()">
<br/>
<input id="btn" type="button" value="Test"></input>
</body>
</hmtl>
1 голос
/ 05 октября 2011

Ваш пример на самом деле не иллюстрирует разницу, так как вы не определяете область действия externalValue. В Javascript вы можете произвольно вкладывать функции друг в друга, и замыкания гарантируют, что внутренние функции могут видеть внешние функции, даже если они вызваны после того, как внешние функции больше не находятся в области видимости.

В Java функции вложения (пока) не разрешены, и поэтому замыкания даже не вступают в игру. Наличие поля класса вместо outerValue и метода класса вместо вашей функции отличается, так как поле курса связано с областью действия класса, а не с методом.

1 голос
/ 05 октября 2011

Представьте, что функция outerFn() была передана как обратный вызов.Некоторое время спустя, когда он запустится, даже если outerValue выйдет из области видимости, он все равно будет доступен в закрытии.

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...