js作用域解释下

这两个的区别 为何第一个报错了 感觉是作用域 但是讲不出个所以然 ,有没有具体解惑的
第一种


function e (v) {
    console.log(w)
}
 function a(z){
    return function b(y) {
        return function c(x) {
            return function d(w) {
                return e
            }
        }
    }
}
a(1)(2)(3)(4)(5)
// 报错

第二种


 function a(z){
    return function b(y) {
        return function c(x) {
            return function d(w) {
                return function e (v) {
                    console.log(w)
                }
            }
        }
    }
}
a(1)(2)(3)(4)(5)
// 4
阅读 2.3k
4 个回答

js中引用一个变量时,当前作用域未定义会去上级作用域寻找,你可以简单的理解成一个{ }包裹着的是一个作用域。
你可以成功运行的那段代码因为上级作用域有个参数是w,直接引用了那个变量,不会报错。
不能运行的那段,那个function外面就是window了,js找遍了上级没有找到对w的定义,报错了

function e (v) {
    console.log(w)
}

第一个报错很明显,w未定义啊。

和作用域有毛关系 问题是值都没传递

仔细看看我下面的俩种写法

function e (v) {
    console.log(v)
}
 function a(z){
    return function b(y) {
        return function c(x) {
            return function d(w) {
                return e(w)
            }
        }
    }
}
a(1)(2)(3)(4)   //输出4

=============================

function e (v) {
    console.log(v)
}
 function a(z){
    return function b(y) {
        return function c(x) {
            return function d(w) {
                return e
            }
        }
    }
}
a(1)(2)(3)(4)(5)  //输出5

第一种当然报错。

function e (v) {
    console.log(w)
}

w的作用域在e这个函数内,没有定义

第二种不会报错,可以看看闭包的相关知识。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题