Почему эта внутренняя функция возвращает undefined? - PullRequest
1 голос
/ 23 марта 2012

Я делаю это

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

    function getMyVar() {
        return myVar;
    }
}

var myProperty = myFunction;
myProperty.getMyVar();  // tells me myProperty.getMyVar is not a function.

и

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

    function getMyVar() {
        return myVar;
    }
}

var myProperty = myFunction();
myProperty.getMyVar();   // tells me myProperty is undefined

и даже

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

    function getMyVar() {
        return myVar;
    }
}

var myProperty = new MyFunction();
myProperty.getMyVar();  // tells me myProperty.getMyVar is not a function.

и во всех трех случаях у меня возникают проблемы.Я включил проблему, как в комментариях во всех трех разделах.Теперь, прежде чем кто-то скажет мне просто использовать замыкание, я не пытаюсь понять замыкания, я пытаюсь точно понять, что происходит с внутренними функциями.

Если вы можете объяснить выше, я был бы благодарен.Потому что это противоречит мне.

Спасибо

Ответы [ 2 ]

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

Что вы сделали, это просто определили функцию внутри myFunction, создавая замыкание ...

Чтобы исправить реализацию, сделайте getMyVar элемент экземпляра :

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

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

Вы не выставляете функцию getMyVar.

Вы хотите:

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

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

Однако myVar также локально ограничен для выполнения функции ... и функция не была выполнена.

Последние строки должны быть

(new myFunction()).getMyVar(); 

РЕДАКТИРОВАТЬ: Хотя, возможно, все, что вы ищете, это псевдо-пространства имен? В этом случае вы можете сделать:

var myObject = { 
    myProperty: "value",
    myFunction: function() { }
}

Или, более вероятно, вы пытаетесь заставить myVar действовать как личный участник, в этом случае вы можете сделать:

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

    return { 
        getMyVar: function() {
            return myVar;
        }
    }
}(); //self-executing function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...