首页 > JS构造函数调用时函数中局部变量为什么不会被所有实例公用,根本原理是什么?

JS构造函数调用时函数中局部变量为什么不会被所有实例公用,根本原理是什么?

问题来自《Javascript高级程序设计(第3版)》187页的这段代码的思考:

        function Person(name){
        
            this.getName = function(){
                return name;
            };
        
            this.setName = function (value) {
                name = value;
            };
        }
        
        var person = new Person("Nicholas");
        alert(person.getName());   //"Nicholas"
        person.setName("Greg");
        alert(person.getName());   //"Greg"
        
        //下面为我自己添加的
        var person2 = new Person("Danny");
        alert(person2.getName());   //"Danny"
        alert(person.getName());   //"Greg"
        
      

每次实例化一个对象都要新建一个变量name吗,name并不是对象实例的属性,那么name变量究竟保存在哪里?

原书解释:“私有变量name在Person的每一个实例中都不相同,因为每次调用构造函数都会重新创建这两个方法。”这句我没看懂,重新创建对象中的方法这没有问题,构造函数中的私有变量name是为什么在每个实例中都不同。

再写一个例子供参考:

        var A = function(a,b){
            var a=a;
            this.test = function(){
               console.log(a,b);
            }
        }
        
        var a = new A(1,2);
        a.test();   // 1 2

        var a2 = new A(3,4);
        a2.test();   // 3 4
        a.test();   //为什么是 1 2 而不是 3 4 或 3 2 ?
        

function在javascript中也是一种数据类型


你应该先去了解下闭包。


感谢代码宇宙前辈,是正解

两次执行同一个函数,会生成两个不同的变量对象。
因此,两个name值保存在不同的变量对象中,互不影响。

【热门文章】
【热门文章】