Javascript闭包。词汇与函数上下文。

时间:2018-08-13 19:07:59

标签: javascript closures

我的问题是,为什么以下代码打印1而不是500;而   当回调被调用并且找不到变量计数时,它不是首先查看func1的上下文吗?

function func1(cb){
  let count = 500
  cb()
}


let count = 1

function func2() {
  console.log(count);
}


func1(func2) 

3 个答案:

答案 0 :(得分:0)

Let是范围变量。在func1中,它只是函数作用域变量。您应该使用一个全局范围变量,而不是创建一个新的全局范围变量。

答案 1 :(得分:0)

这是范围的问题,第一个count的范围与第二个范围不同,不同的是:

    let count = 1
    
    function func2() {
      console.log(count);
    }
    
    
    function func1(cb){
      count = 500
      cb()
    }

    func1(func2)

您得到了您所期待的,

而且,如果您这样做:

    let count = 1
    
    function func2() {
      console.log(count);
    }
    
    
    function func1(cb){
      let count = 500
      cb()
    }
    func1(func2) 

您正在创建一个新的变量计数,其中第一个计数的范围不同,这意味着它将打印1

答案 2 :(得分:0)

1。 func1(func2)

您正在将函数func2作为参数传递给func1

2。让计数= 1

您已声明全局变量

3。。您已经将func2传递给func1作为参数,但是您在此没有做任何事情。您已经在函数中声明了变量,但它超出了func2的范围

function func1(cb){
  let count = 500
  cb()
}

4。。仅func2 知道全局计数变量,因此它将将控制台1 代替控制台func1 >

function func2() {
  console.log(count);
}