2013-05-30 5 views
0

В JavaScript функции всегда могут обращаться к глобальным переменным. У меня есть класс, который я использую, и он ссылается на глобальные переменные. Вот подобный класс:Переменная область внутри конструктора

function Test(){ 
    this.abc = abc; 
} 

Если установить глобальный abc затем вызвать это, она работает.

var abc = 123, 
    testA = new Test; 

console.log(testA.abc); // 123 

Но что, если я не хочу abc быть глобальным? Я завернул код в вызов функции, но я получаю сообщение об ошибке abc is not defined.

(function(){ 
    var abc = 123, 
     testA = new Test; // ERROR: abc is not defined 

    console.log(testA.abc); 
})(); 

Как я могу читать локальные переменные внутри конструктора JavaScript без добавления переменных в глобальную область?

+0

Почему бы не передать 'abc' в качестве параметра' 'Test (.)? – lurker

+0

@mbratch: Потому что я не писал 'Test'. Мне просто интересно, могу ли я «исправить» его, не переписывая. :) –

ответ

3

Проблема в том, что локальные переменные имеют лексические scope.

Это означает, что они должны быть разрешены, они должны находиться в одном и том же кодовом блоке или в , содержащем блоки кода.

Ваш код будет работать только если определение Test также в IIFE:

(function(){ 
    var abc = 123, 
     testA = new Test; // ERROR: abc is undefined 

    function Test() {  // this will be hoisted 
     this.abc = abc; 
    } 

    console.log(testA.abc); 
})(); 
+0

Да, я боялся, что этого не было. –

+1

, так что вы пытаетесь заставить 'Test' работать, не переписывая его, но ссылаясь на локальную переменную вместо глобальной? – Alnitak

+0

Да, в значительной степени. «Тест» был написан кем-то другим и основывается на глобальных переменных (по какой-либо причине). Я ненавижу глобальные переменные и задаюсь вопросом, избегаю ли я их. –

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