请解释为什么此代码返回未定义

时间:2020-06-15 05:43:38

标签: javascript function undefined hoisting

我认为函数提升将不允许访问父函数产品,但是为什么不能访问全局作用域。请帮助。谢谢

const product = 'product'

function foo() {
  employeeId();
  var product = 'Car';
  return;

  function employeeId() {
    //this is giving me undefined
    console.log(product);
  }
}

foo();

当我尝试获得产品的价值时,它给出的是不确定的。 我很困惑,不确定是什么原因导致了这个问题。

4 个答案:

答案 0 :(得分:2)

您正在变量分配之前调用employeeId()。当javascript运行代码时,它首先为存储在var,let和const中的所有变量分配undefined。这就是为什么您不确定。如果您在employeeId()之后调用var product = 'Car',则会显示正确的值

答案 1 :(得分:0)

函数和变量将被吊起。但是请注意,只有声明会被悬挂。而分配过程将在下一阶段。因此,您正在调用尚未初始化的product打印功能。 undefined将因此显示。

const product = 'product'

function foo() {
  //JS interpret like this for the hoisting effect
  var product;
  employeeId();
  product = 'Car';
  return;

  function employeeId() {
    //actually printing the variable which located inside the function
    console.log(product);
  }
}

foo();

另一个具有不同变量名称的测试用例

const product2 = 'product'

function foo2() {
  //JS interpret like this for the hoisting effect
  var product;
  employeeId();
  product = 'Car';
  return;

  function employeeId() {
    //print the global variable
    console.log(product2);
  }
}

foo2();

答案 2 :(得分:0)

因为JS是单线程编程语言。这意味着一次只能执行一组指令!

因此您需要在employeeId()之后调用var product = 'Car',然后将其返回

function foo() {
    var product = 'Car'; 
    return employeeId();
    function employeeId() {
         console.log(product);
  }
 }
 foo();

答案 3 :(得分:0)

在声明阶段,内部函数中的变量和函数会被吊起,而变量var product将在执行引擎遇到该变量并设置其值undefined时被声明。稍后,该变量将被分配一个值“ Car”,因此在调用employeeId()时,product的值仍为undefined

请注意,全局const product = 'product'对此不起作用。即使您使用letvar声明全局产品,结果也将相同。在初始化阶段,将再次在内部函数中声明var product,并将其值设置为undefined

var product = 'product' //Even if you declare this with let/const the result will be same

function foo() {
  employeeId();
  var product = 'Car';
  return;

  function employeeId() {
    //this is giving me undefined
    console.log(product);
  }
}

foo();