2014-11-20 2 views
0

Вот что-то странное, и я не знаю, как его преодолеть.Ограничения конструктора функций JavaScript

В принципе, у меня есть эта строка здесь:

var s = 'var Bla = {variable: true, get: function() { return this.variable;}}; return Bla;' 

и с помощью конструктора Function для разбора этой конструкции.

var fn = new Function(s); 

Он отлично работает, за исключением того, что внутренняя функция «получить» больше нет .. как он не получил разобран ?!

fn().variable -> is there and returns "true". 
fn().get -> is undefined, not existing. 

Любые идеи?

PS: Я редактировал свой оригинальный вопрос, чтобы указать, что действительно отсутствует.

+0

Потому что вы не передаете функцию конструктору функции. – Brennan

+0

Интересно, используете ли вы синтаксис [getter синтаксис] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get). Вы можете попробовать изменить имя этого свойства. – jfriend00

+2

@Brennan - они передают тело функции конструктору, который разрешен. – jfriend00

ответ

4

код Вы разместили эквивалент этого:

var fn = function() { 
    var Bla = { 
     variable: true, 
     get: function() { 
      return this.variable; 
     } 
    }; 
    return Bla; 
} 

Таким образом, вы не можете напрямую использовать fn.variable или fn.get - вместо этого вам нужно вызвать эту функцию:

var x = fn(); 
alert(x.get()); //alerts true 
x.variable = 1; 
alert(x.get()); //alerts 1 

Bla является только локальной переменной внутри функции и не возвращается из нее. Код может быть легко:

var fn = function() { 
    return { 
     variable: true, 
     get: function() { 
      return this.variable; 
     } 
    }; 
} 

И вы получите тот же эффект. После вызова функции, объект, возвращаемый из него то, что содержит variable и get:

example object

+0

Извините, я должен был быть более явным. Это работает, однако .get не является частью объекта возврата Bla .. его просто нет. – flyandi

+1

@flyandi Можете ли вы объяснить больше? 'Bla' - это только локальная переменная внутри функции и фактически перестает существовать, как только функция возвращается. Объект, возвращаемый из функции, безусловно, содержит как 'переменные', так и' get': http://imgur.com/VLm4b7y –

+0

Я сейчас чувствую себя глупо. Я буквально забыл() одного из вызывающих участников этой процедуры в моя библиотека .. но это был недостающий(), который вызвал проблему :-) - Спасибо всем! – flyandi

0

Ваш пример работает отлично.

Я попробовал и выпуск:

fn().get() 

возвращает истинное, как и следовало ожидать.

+0

какой браузер - я в Chrome, и он не будет работать. – flyandi

+0

@ flyandi - любой браузер, поддерживающий ES5 (например, Chrome). – RobG

+0

Я сделал это в хроме. Я открыл отладчик и скопировал и вставил две строки, которые у вас есть в консоли. Затем я выпустил: fn(). Get(); –

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