2016-03-13 4 views
1

Что-то кажется неправильным в следующем коде. Он объявляет функцию с eval, называет ее - до тех пор все в порядке - и вызывает ее снова, но, хотя функция и, таким образом, получает ошибку.Область видимости и функций

var fn = function() { 
    return isTwo(2); 
}; 
var check = function() { 
    eval("var isTwo = function(value) { return value == 2 }") 
    console.log(isTwo(2)); // returns true 
    console.log(fn()); // returns isTwo is not defined 
} 
check(); 

разворачивания check функции сделанные вещи работает, но кажется неправильным. Почему использование функции eval внутри функции должно изменить ее поведение?

var fn = function() { 
    return isTwo(2); 
}; 

eval("var isTwo = function(value) { return value == 2 }") 
console.log(isTwo(2)); // returns true 
console.log(fn()); // returns true 
+0

'isTwo' не имеет значения в' fn' в первом коде. – elclanrs

+0

Не используйте 'eval' для объявления переменных. Это плохая практика, и она запрещена в строгом режиме. – Oriol

+0

@Oriol, вы не знаете, чего я пытаюсь достичь, поэтому вы можете указать, что какая-то статья в eval - это злое направление, но вы можете весить свои слова ^^ http://stackoverflow.com/questions/197769/ когда-is-javascripts-eval-not-evil –

ответ

2

Поскольку eval действует как если бы вы заменили строку с кодом для оценки. Поэтому var isTwo = function(value) { return value == 2 } определяет переменную local, и к ней не может быть доступна другая функция. Причина, по которой она работает во внешнем блоке, состоит в том, что она представляет собой переменную global, и к ней можно получить доступ другой функцией.

+1

Да, 'eval' дует мне в голову, поэтому я потерял свой JavaScript. Спасибо ^^. –