为什么在变量之前首先声明函数,但是同样的函数不能被解析但变量可以?

时间:2018-02-20 20:52:53

标签: javascript hoisting

return ResponseEntity.ok("Success");"功能"的原因打印输出可能是因为分别因为在创建阶段,函数是在变量(A)之前的变量对象中创建的。

但是如果函数是在变量foo之前创建的,那么为什么我不能解析函数(参见foo),而是我可以解析变量(参见(D) })?

(C)

3 个答案:

答案 0 :(得分:1)

是事件的顺序

  1. var foo已悬挂,并声明变量foo
  2. function foo() {}被悬挂,重新声明变量foo并为其指定值(函数)
  3. console.log(typeof foo)记录功能
  4. foo = 'hi'foo分配一个字符串,覆盖之前的值(该函数)
  5. console.log(foo)记录字符串
  6. foo()抛出错误,因为字符串不是函数

答案 1 :(得分:0)

函数声明在其他所有内容之前运行

(function() {

function foo() { //Function declaration
  return 'hello';
}

console.log(typeof foo); // (A) function pointer
console.log(typeof bar); // (B) undefined

var foo = 'hi',
 bar = function() { //Function expression
   return 'world';
 };

console.log(foo); // (C) hi
  foo();// (D) error
})();

想象一下你的程序看起来像这样,因为foo()是第一个运行

的程序

答案 2 :(得分:0)

一开始你变量foo被挂起但没有初始化,所以它是未定义的。然后它被函数声明覆盖。这就是typeof返回Function的原因。然后将值赋给它('hi'),因此尝试调用该函数失败。

对于bar,您使用的是函数表达式语法(var bar = function())而不是函数decalration(function bar()),因此bar作为未定义的变量被提升,稍后将值分配给它