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 ?
        
阅读 5.1k
3 个回答

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

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

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

你应该先去了解下闭包。

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

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