示例中

时间:2018-04-18 13:23:56

标签: javascript typeof

在下面的例子中,我试图获得输出为函数类型添加数字,但输出似乎不同。

<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(){})给出了函数的结果。

enter image description here

4 个答案:

答案 0 :(得分:1)

对于此代码段,您实际上并不需要evaltypeof (function foo(){})typeof foo的结果相同。您不需要eval因为eval(function foo(){})(function foo(){})相同,因为参数不是字符串。如果您想使用eval,请改用字符串:

&#13;
&#13;
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;
&#13;
&#13;

function foo(){},这里是一个函数表达式。他们的名字只能在自己内部访问,而不是在外部。可以在外部访问函数声明或指定的函数表达式

&#13;
&#13;
(function foo(){}); // (…) forces expression context. `foo` is not defined outside of it.

console.log(foo); // ReferenceError
&#13;
&#13;
&#13;

&#13;
&#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;
&#13;
&#13;

&#13;
&#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;
&#13;
&#13;

&#13;
&#13;
function foo(){} // Statement context, thus this is a function declaration

console.log(foo); // function foo
&#13;
&#13;
&#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);