JS 函数式基础

第一段代码

var n = 1; //全局变量,作用域为当前文档
function f() {
    var n = 2; //局部变量,作用域仅限于函数体内
    var e = function () { //使用function 语句定义的函数结构体
        return n; //检查变量n到底返回什么值
    };
    console.log(e());//2
    return e; //返回函数结构
}

console.log(f());//调用外层函数  调用f()相当于调用e;
console.log(f()());//调用外层函数 调用f()()相当于调用e();//2

第二段代码

var n = 1; //全局变量,作用域为当前文档
function f() {
    var n = 2; //局部变量,作用域仅限于函数体内
    var e = new Function("return n;");//使用Function构造函数定义的函数结构体
    console.log(e());//1
    return e; //返回函数结构
}

console.log(f());//调用外层函数  调用f()相当于调用e;
console.log(f()());//调用外层函数 调用f()()相当于调用e();//1

第一段和第二段 var e 赋值不一样,前者把函数作为直接量赋值给变量,后者是new的构造函数,最后两段代码结果不一样。别分是2和1。我在查阅资料是,有官方解释是这样的:因为Function()构造函数定义的函数作用域需要动态确定,而不是在定义函数时确定的。 官方这个解释我没明白 这个动态确定是什么时候确定的,以什么标准来确定的。 哪位经验丰富的朋友分享下,谢谢

阅读 1.4k
2 个回答

词法作用域和动态作用域,犀牛书写的很详细了

clipboard.png

因为Function()构造函数定义的函数作用域需要动态确定,而不是在定义函数时确定的。
说的挺清楚的
1.定义函数function关键词的函数作用域是词法即刻确定的
2.Function()构造函数定义的函数作用域是运行时动态确定的

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