函数声明和函数表达式通过闭包获取变量的原理是什么?

新手上路,请多包涵
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}

checkscope()();    //local scope

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}

var foo = checkscope(); 
foo();    //local scope

两段代码的结果一样,想请问一下各位大佬期中的奥秘。第二段代码的foo是一个函数表达式,不应该获取全局变量吗?

阅读 1.2k
2 个回答

并不是闭包获取变量,而是通过匿名函数闭包处理,动态保存生成匿名函数时的变量值。
你这个代码只是因为匿名函数中函数块作用域中优先本地变量,而忽略了全局变量而已。

你其实比较2个部分,foo这时的值就是一个函数定义啊。

额,你这两段代码一模一样
函数内变量的作用域是在声明期间就固定了的,所以你现在只是改变调用方式是没用的,你不管怎么改变调用方式,它的作用域链是固定的

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