Это закрытие JavaScript? - PullRequest
       15

Это закрытие JavaScript?

1 голос
/ 23 марта 2012

У меня есть это ....

function MyFunction() {
    var myVar = "I think I am encapsulated";

    this.getMyVar = function() {
        return myVar;
    }
}

var myProperty = new MyFunction();
console.log(myProperty.getMyVar());

myProperty.myVar = "you're not encapsulated";
console.log(myProperty.getMyVar());

Это выводит: "Я думаю, что я инкапсулирован дважды".Зачем?Я не думал, что это закрытие ...

Ответы [ 3 ]

6 голосов
/ 23 марта 2012

Закрытие происходит вокруг функции "getMyVar".Переменная "myVar" внутри в конструкторе является локальной переменной, и не видима вне функции, кроме как возвращаемое значение из getMyVar.myVar "свойство объекта делает именно это, но функция" getMyVar "не возвращает свойство объекта;он возвращает значение локальной переменной в замыкании.

2 голосов
/ 23 марта 2012
var myVar = "I think I am encapsulated";

this.getMyVar = function() {
    return myVar;
}

Это закрытие, и будет возвращена переменная myVar с момента создания функции .Обратите внимание, что это локальная переменная, поэтому после выхода из этой функции нет другого доступа к ней.

var myVar = "I think I am encapsulated";

Обратите внимание, что это не this.myVar (переменная, которую вы устанавливаете позже с помощью myProperty.myVar).

Вероятно, вы пытаетесь сделать следующее:

function MyFunction() {
    this.myVar = "I think I am encapsulated";

    this.getMyVar = function() {
        return this.myVar;
    }
}
2 голосов
/ 23 марта 2012

Да, это так.

Когда вы определяете функцию внутри другой функции, внутренняя функция имеет доступ к all локальных переменных внешней функции...

В вашем случае getMyVar имеет доступ к myVar - через замыкание.

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