求助:一道js面试题

发布于 2022-09-04 17:46:24 字数 331 浏览 18 评论 0

var a = 0;
        var b = 0;

        function A(a) {
            A = function(b) {
                console.log('a+b=' + (a + b++));
            }
            console.log('a=' + a++);
        }
        A(1);
        A(2);
//1
//4

面试的时候遇到的一个题,回来看了半天也没搞懂,希望大佬可以给讲解讲解o(╯□╰)o

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无所的.畏惧 2022-09-11 17:46:24

JavaScript特性:

  • 闭包机制:闭包创建后,可以保存创建时的活动对象。

  • 自加操作符:++,当++作为后缀操作符时,调用++的表达式的值为自加前的自加对象的值。

实例分析:

// 此处说明 ++操作符的特性。
var i = 0;
var eg = i++
console.log(i, eg) // 1 0
var a = 0;
var b = 0;
function A(a) {
    A = function(b) {
        console.log('a+b=' + (a + b++));
    }
    console.log('a=' + a++);
}
// 第一次调用A时,执行到console.log('a=' + a++)时,a已经完成自加,此时a的值为2,a++的值为1。
A(1);
// 第二次调用A时,A已经被重新赋值,指向了一个新的函数引用;
// 由于标识符A是在全局作用域定义的,所以在函数内部被重新赋值,在全局作用域也可以访问到重新赋值后的函数。此时,也创建了一个闭包,该闭包保存了创建环境的活动对象。
// 此时活动对象:{ a: 2 },同时,根据传入的数值2,确定 b = 2,b++值为3。
// 执行到 console.log('a+b=' + (a + b++)),故而输出4
A(2);
π浅易 2022-09-11 17:46:24

这道题考察闭包和对象的引用的问题(函数也是对象)
其实就是后面的A的重新赋值后的里面a取得是上一个a里面的变量,而此时由于上一步中的a++导致,前一个A里面的a的变量值为2,所以后面的A的a的值为2,所以2+2=4;

简单的看

var a = 0;
    var b = 0;

    function A(a) {
        B = function(b) {
            console.log('a+b=' + (a + b++));
        }
        console.log('a=' + a++);
    }
    A(1);
    B(2);//这样你应该可以看得明白点
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文