在下面的例子中,我试图获得输出为函数类型添加数字,但输出似乎不同。
<html>
<head></head>
<body>
<script>
var k = 1;
if (1) {
eval(function foo(){});
k += typeof foo;
}
console.log(k);
</script>
</body>
</html>
预期输出:
1function
实际输出:
1undefined
有人可以解释为什么输出与预期不同?
注意:eval的类型(function(){})给出了函数的结果。
答案 0 :(得分:1)
对于此代码段,您实际上并不需要eval
。 typeof (function foo(){})
与typeof foo
的结果相同。您不需要eval
因为eval(function foo(){})
和(function foo(){})
相同,因为参数不是字符串。如果您想使用eval
,请改用字符串:
var x = function foo(){};
console.log(eval(x) === x); // true, because they’re identical
eval("function foo(){}");
// or
eval("var foo = function foo(){}");
console.log(foo); // function foo, because one of the above `eval`s declared it
&#13;
function foo(){}
,这里是一个函数表达式。他们的名字只能在自己内部访问,而不是在外部。可以在外部访问函数声明或指定的函数表达式 。
(function foo(){}); // (…) forces expression context. `foo` is not defined outside of it.
console.log(foo); // ReferenceError
&#13;
var foo = function foo(){}; // Right-hand side is an expression, thus this is a function expression, but its result is assigned to a variable.
console.log(foo); // function foo
&#13;
var bar = function foo(){}; // Same thing, but with a different variable.
console.log(bar); // function foo
console.log(foo); // ReferenceError, since the name `foo` still is not visible outside.
&#13;
function foo(){} // Statement context, thus this is a function declaration
console.log(foo); // function foo
&#13;
如果函数被调用,那么(function foo(){ console.log(foo); })
就可以了,不一定是同名。
最后,typeof
会为未声明的变量返回"undefined"
。
答案 1 :(得分:-1)
typeof foo返回undefined,因为它未在该范围中定义
k + = undefined被转换为字符串并导致:
1function
答案 2 :(得分:-1)
eval()需要字符串作为参数。 所以你必须在引号内包装 function foo()。
var k = 1;
if (1) {
eval('function foo(){}');
k += typeof foo;
}
console.log(k);
文档: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
答案 3 :(得分:-1)
据我所知,你所做的是为该函数命名,但是你并没有将它“绑定”到一个变量,所以函数存在,但是没有指向该函数的“指针”。 typeof
需要一个“指针”指向要评估的内容,但是你没有声明任何人,你只是为该函数命名。仅当您不打算直接执行该函数时,这对于调试目的很有用。
也可以直接传递对象:
var k = 1;
if (1) {
k += typeof function foo(){}; //1function
}
console.log(k);