Javascript:词汇和执行范围

时间:2018-04-18 06:34:47

标签: javascript

试图将范围包裹在我的头上: - )

如何重构此代码以便能够输出 函数'a', 'b' and 'c'中的third()

任何没有混淆和不必要理论的解释都会有所帮助。



var a = 1;

first = () => {
  let b = 2;
  second = () => {
    let c = 3;
    console.log(a, b); // Output 1, 2
    third(); // Output 1, 2, 3
  }
  console.log(a); // Output 1
  second();
}

third = () => {
  console.log(a, b, c);
}

first();




5 个答案:

答案 0 :(得分:1)

b未在函数third()的范围内定义。你也会得到同样的错误。如果你在第二个内部移动第三个定义,它将获得第一个和第二个范围的访问权限,因为它将成为它们的关闭,然后你将得到预期的行为。

var a = 1;

first = () => {
  let b = 2;
  second = () => {
    let c = 3;
    console.log(a, b); // Output 1, 2
    third = () => {
        console.log(a, b, c);
    }
    third(); // Output 1, 2, 3
  }
  console.log(a); // Output 1
  second();
}


first();

编辑:错字

答案 1 :(得分:0)

最简单的答案是通过在任何函数之外定义它们来简单地使所有三个变量全局化,并在需要时用值填充它们。

var a = 1;
let b;
let c;

first = () => {
  b = 2;
  second = () => {
    c = 3;
    console.log(a, b); // Output 1, 2
    third(); // Output 1, 2, 3
  }
  console.log(a); // Output 1
  second();
}

third = () => {
  console.log(a, b, c);
}

first();

答案 2 :(得分:0)

希望,这就是你要找的东西=>

var a = 1, b, c;

first = () => {
    b = 2;
    second = () => {
        c = 3;
        console.log(a, b); // Output 1, 2
        third(); // Output 1, 2, 3
     }
    console.log(a); // Output 1
    second();
}

third = () => {
    console.log(a, b, c);
}

first();

答案 3 :(得分:0)

  

任何没有混淆和不必要理论的解释都会有所帮助

bc的本地范围不是first,因此 定义third其中b和{{1}可以访问

c

或者,在调用var a = 1; first = () => { let b = 2; second = () => { let c = 3; console.log(a, b); third = () => { //defined it inside second console.log(a, b, c); }; third(); } console.log(a); second(); } first(); 时,将abc作为参数传递给third

var a = 1;

first = () => {
  let b = 2;
  second = () => {
    let c = 3;
    console.log(a, b);
    third(a,b,c); // pass a, b and c as parameters
  }
  console.log(a); 
  second();
}

third = (a,b,c) => { //accept a, b and c
  console.log(a, b, c);
}

first();

答案 4 :(得分:0)

在评论中,你必须传递你的变量。第三个函数可以访问变量a但不能访问bc,因为它们在函数firstsecond中作为本地范围。

函数在自身内部寻找变量,然后在父级内部寻找变量,直到全局变量。

因此,函数second包含变量c,但不包含ab。它在其父级中查找变量b,然后是全局变量a。但是,函数third不是嵌套的,因此它查找变量的下一个范围是全局范围,其中包含变量a