var y = 1;
if (function f(){}) {
y += typeof f;
}
console.info(y);
Вывод этого кода - 1undefined
. Я понимаю причину, по которой условие в операторе if
оценивается с использованием eval
во время выполнения, но я не могу понять, почему он не выводит 1function
.
Это вообще не eval
. Это выражение функции. То же, что и if ('foo')
. Также нет возможности получить доступ к этому строковое выражение'foo'
, потому что это просто выражение, не назначенное ничему.
В вашем примере функция ограничена только скобками условия проверки оператора if
.
Попробуйте следующее:
var y = 1;
var f = function() { };
if (f) {
y += typeof f;
}
console.info(y)
Вы можете определить функцию в тесте if, если указатель на функцию определен снаружи.
var y = 1;
var f = null;
if (f = function() { }) {
y += typeof f;
}
console.info(y)
Я понимаю приведенный вами пример. Но что подразумевается под областью действия в скобках, и даже если это область действия в скобках, то почему в "y + = typeof f;" typeof f не определен? Он должен выдать ошибку ссылки.
Он не ограничен «внутри оператора if», он нигде не ограничен. Это то же самое, что и if ('foo')
. Вы также не можете получить доступ к 'foo'
нигде.
С помощью 'if (function f () {})'. Javascript увидит, что да, это функция, и поэтому результат теста будет верным. Но после завершения теста f больше не существует. Таким образом, f не определено и не имеет типа в блоке кода if.
f
никогда существовал где угодно, потому что это выражение функции, а не объявление функции.@StephenHewison, если бы это дало мне ссылку на ошибку, я бы предположил, что в какой-либо области с именем 'f' нет переменной. Но если typeof f не определен, это означает, что в какой-то области есть переменная. и в соответствии с объявлением функций es6 являются областью блока. Согласно вашему ответу, но f больше не существует после завершения теста. если он не существует, он должен был выдать ошибку ссылки. Какова реальная концепция, лежащая в основе этой функции?
@Suraj f
и typeof f
- это разные вещи. typeof
никогда не выдает эталонную ошибку.
Спасибо, @ stephen & @deceze, теперь я получил ответ: «typeof» никогда не выдает ошибку из-за «IsUnresolvableReference».
Вам необходимо определить функцию вне фигурных скобок if, в противном случае область действия f
ограничена внутренней частью условия.
Если вы переформулируете это так, это работает:
var y = 1;
//Pick One:
var f = () => {}; //If you are using ES6
function f() {}; //If you are not using ES6
if (f) {
y += typeof f;
}
console.info(y); // 1function
FWIW, Microsoft Edge выводит
1object