2015-02-19 4 views
0

Это может быть очень простым, но я потерял свой путь в поиске ответа,Чтение значения переменного внутри именованной функции в JavaScript

У меня есть именованная функция внутри зрения Backbone. Я пытаюсь написать модульный тест для этой именованной функции, и я мог видеть, что переменная объявляется в области функций. Состояние этой переменной изменяется в зависимости от определенных сценариев.

Я создал экземпляр объекта просмотра внутри своего набора тестов, и когда я делаю console.log (viewObject.namedFunction), я вижу, что вся функция регистрируется правильно. Теперь, как мне получить доступ к переменной внутри namedFunction, я ожидал чего-то вроде viewObject.namedFunction.variableName, но это не сработает, и когда я это сделал, он не работал должным образом.

Если переменная привязана к области viewObject, тогда было бы легко получить к ней доступ. Но в этом случае это не так, может кто-нибудь, пожалуйста, помогите мне в удержании переменной внутри именованной функции в объекте вида из набора тестов.

+1

возможно, будет легче, если вы предоставите пример кода. –

+0

Если я правильно вас понимаю, то, что вы просите, предотвращается, поскольку область действия внутри функции недоступна извне. Это намеченное поведение. Если ваша переменная не объявлена ​​вне функции, или функция возвращает переменную, у вас не будет доступа к ней. Образец кода поможет уточнить, но я думаю, что то, о чем вы просите, невозможно. Если бы вы могли опубликовать образец кода и что вы надеетесь достичь, возможно, мы сможем найти альтернативное решение. –

+0

Вот пример кода, – Sai

ответ

1

Я думаю, я понимаю ваше замешательство, потому что, когда вы определяете переменную с помощью var в window объеме, она становится собственностью на window объекта .. .Похоже, что после того, как вы определяете переменную в дочерней области, она должна стать членом локального контекста, верно? Неа. Глобалы специальные ;-)

В самом деле, если что были дело, было бы без секретности!

Если вы хотите, чтобы sign был общедоступным, напишите его.

Единственная проблема такого подхода заключается в том, что теперь вы можете присвоить новое значение sign из любой точки мира. Классический и предпочтительный подход к этой проблеме заключается в создании функции getter для вашей частной переменной.

var obj = { 
    namedFunction : function myself() { 
     var sign = 3; 
     myself.getSign = function(){return sign;}; 
    } 
}; 
obj.namedFunction.getSign(); 

Это не единственный подход, но я надеюсь, что это было полезно.

+0

Эй, спасибо, этот подход работает. Но я чувствую, что для тестового кода javascript всегда хорошо избегать локальных переменных, потому что с ним трудно справиться в тестовых наборах. – Sai

1

Один из способов сделать это, как, например:

namedFunction = (function(){ 
    var theActualFunction = function(){ 
      //Do something 
      //Access variable like: theActualFunction.MyVariable 
    }; 
    theActualFunction.MyVariable = "value"; 
    return theActualFunction; 
}()); 
+0

Если вы не хотите создавать закрытие, вы также можете установить свойство из самой функции. Именованные функциональные выражения могут ссылаться на самих себя. –

+0

спасибо, я тоже пробовал это, и он работает !!! – Sai

Смежные вопросы