2015-08-01 2 views
0

У меня есть кусок кода с ReferenceError hereновая функция сфера

или ниже:

function foo() { 

    function bar() { 
     console.log('bar'); 
    } 

    var x = new Function('bar();'); 
    x(); 
} 

foo(); // ReferenceError: bar is not defined 

Можно ли сделать это случиться? Я имею в виду, что функция бара существует внутри new Function

+0

Я не знаю, какой ответ принять, поэтому я принять один с большинством голосов после нескольких дней. Спасибо вам всем. – Masterakos

ответ

3

Функции, созданные с помощью конструктора Function, не создают замыкания на их контексты создания; они всегда создаются в глобальном масштабе. При их запуске они смогут получить доступ только к своим локальным переменным и глобальным, а не к тем из областей, в которых был вызван конструктор Function.

- MDN

Так что нет, это не при использовании этого подхода.

Не используйте конструктор функций. Он неэффективен, а преобразование строк в код - fraught with problems.

function foo() { 
 

 
    function bar() { 
 
     alert('bar'); 
 
    } 
 

 
    function x() { 
 
     bar(); 
 
    } 
 
    x(); 
 
} 
 

 
foo();

+0

Дело в том, что бар определен/кодируется мной, но пользователь должен его использовать. Пользователь вводит редактор кода и выполняет его. – Masterakos

+0

Так что используйте 'eval', если вы должны принять такой подход. – 1983

2

Один из возможных подходов заключается в использовании eval вместо new Function:

function foo() { 
 

 
    function bar() { 
 
     console.log('bar'); 
 
    } 
 

 
    eval('x = function() { bar(); }'); 
 
    x(); 
 
} 
 

 
foo(); // works fine.

+0

Я пробовал это, но есть конфликт с «use strict» внутри файла, который я кодирую. Конечно, я могу удалить строгий режим, поэтому я думаю, что это единственный способ. – Masterakos

+1

Возможно, вы захотите объявить 'x', если вам не нужен глобальный var. – 1983

+0

@KingMob конечно. Как это пропустило? : P – Masterakos

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