Если оценка состояния в javascript с использованием eval во время выполнения

 var y = 1;

 if (function f(){}) {
   y += typeof f;
 }
 console.info(y);

Вывод этого кода - 1undefined. Я понимаю причину, по которой условие в операторе if оценивается с использованием eval во время выполнения, но я не могу понять, почему он не выводит 1function.

FWIW, Microsoft Edge выводит 1object

haim770 17.12.2018 12:34

Это вообще не eval. Это выражение функции. То же, что и if ('foo'). Также нет возможности получить доступ к этому строковое выражение'foo', потому что это просто выражение, не назначенное ничему.

deceze 17.12.2018 12:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
2
1 283
2

Ответы 2

В вашем примере функция ограничена только скобками условия проверки оператора 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 не определен? Он должен выдать ошибку ссылки.

Suraj Prakash Joshi 17.12.2018 12:39

Он не ограничен «внутри оператора if», он нигде не ограничен. Это то же самое, что и if ('foo'). Вы также не можете получить доступ к 'foo' нигде.

deceze 17.12.2018 12:43

С помощью 'if (function f () {})'. Javascript увидит, что да, это функция, и поэтому результат теста будет верным. Но после завершения теста f больше не существует. Таким образом, f не определено и не имеет типа в блоке кода if.

Stephen Hewison 17.12.2018 12:44
fникогда существовал где угодно, потому что это выражение функции, а не объявление функции.
deceze 17.12.2018 12:46

@StephenHewison, если бы это дало мне ссылку на ошибку, я бы предположил, что в какой-либо области с именем 'f' нет переменной. Но если typeof f не определен, это означает, что в какой-то области есть переменная. и в соответствии с объявлением функций es6 являются областью блока. Согласно вашему ответу, но f больше не существует после завершения теста. если он не существует, он должен был выдать ошибку ссылки. Какова реальная концепция, лежащая в основе этой функции?

Suraj Prakash Joshi 17.12.2018 13:09

@Suraj f и typeof f - это разные вещи. typeof никогда не выдает эталонную ошибку.

deceze 17.12.2018 13:13

Спасибо, @ stephen & @deceze, теперь я получил ответ: «typeof» никогда не выдает ошибку из-за «IsUnresolvableReference».

Suraj Prakash Joshi 17.12.2018 18:57

Вам необходимо определить функцию вне фигурных скобок 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

Другие вопросы по теме