在运行时使用eval在javascript中进行if条件评估

在运行时使用eval在javascript中进行if条件评估,javascript,scope,eval,Javascript,Scope,Eval,此代码的输出是1未定义的。我得到了在运行时使用eval对if语句中的条件进行评估的原因,但我无法理解为什么它没有输出1function在您的示例中,该函数仅在if语句的测试条件的括号内 请尝试以下操作: vary=1; var f=函数(){}; 如果(f){ y+=f的类型; } console.log(y)您需要在if括号外定义函数,如果没有,则f的范围仅限于条件内部。 如果您像这样重新格式化,它会起作用: var y = 1; if (function f(){}) { y

此代码的输出是
1未定义的
。我得到了在运行时使用
eval
if
语句中的条件进行评估的原因,但我无法理解为什么它没有输出
1function
在您的示例中,该函数仅在
if
语句的测试条件的括号内

请尝试以下操作:

vary=1;
var f=函数(){};
如果(f){
y+=f的类型;
}

console.log(y)
您需要在if括号外定义函数,如果没有,则
f
的范围仅限于条件内部。 如果您像这样重新格式化,它会起作用:

 var y = 1;

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

FWIW,Microsoft Edge输出的
1对象
根本不是
eval
'd。这是一个函数表达式。与
if('foo')
相同。也无法访问该字符串表达式,因为它只是一个未分配给任何对象的表达式。我理解您给出的示例。但括号内的作用域是什么意思,即使它是括号内的作用域,那么为什么在“y+=typeof f;”中未定义typeof f?它应该给出引用错误。它没有范围“在if语句中”,它的作用域不在任何地方。它与
if('foo')
相同。您也不能在任何地方访问
'foo'
。使用'if(函数f(){})“.Javascript将看到是的,这是一个函数,因此测试结果将为真。但一旦测试完成,f就不再存在。因此f是未定义的,在if代码块中没有类型。
f
在任何地方都不存在,因为它是一个函数表达式,而不是函数声明。@StephenHewison,如果它会给出m的话。”e引用错误然后我会假设在任何名为“f”的作用域中都没有变量。但如果没有定义f的类型,则意味着在某个作用域中存在变量。根据es6函数声明为块作用域。根据您的回答,但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.log(y); // 1function