JS - 范围链

时间:2012-11-09 18:38:57

标签: javascript

我认为范围链会做出第一个“test = new test();”工作,但事实并非如此。为什么?

var tool = new Tool();
tool.init();

function Tool(){
    var test;

    function init(){
        //does not work, undefined
        test = new Test();

        //does work
        this.test=new Test();

        console.log(test);
    }
}

function Test(){
}

编辑:我的意思是不工作,它说测试是'未定义的'

2 个答案:

答案 0 :(得分:2)

这很简单。您的Tool实例没有init方法。代码中的init函数只是Tool构造函数的局部函数。 Tool个实例不会继承此类函数。

如果您希望Tool个实例拥有init方法,您可以:

  1. 将其指定为构造函数中的方法:

    function Tool () {
        this.init = function () { ... };
    }
    
  2. 或将其分配给Tool.prototype(构造函数之外!):

    Tool.prototype.init = function () { ... };
    
  3. 第二个选项表现更好,因为所有实例共享相同的init函数。 (在第一个选项中,每个实例都有自己的init函数,该函数在构造函数调用期间创建。)

答案 1 :(得分:1)

您是否尝试访问工具范围内的test或其返回的对象?它们是两个不同的变量。我把它们标记为A和B:

var tool = new Tool();

function Tool(){
    var testA; // Private

    this.init = function(){
        testA = 1;

        this.testB = 9; // Public
    }

    this.getTestA = function(){ // Public method to access the private testA
        return testA;
    }

}

tool.init();

console.log( tool.getTestA() ); // 1
console.log( tool.testB ); // 9

testA被称为私有变量,只能通过工具的方法访问,而testB是公开的。

这是否涵盖了您所寻找的内容?

顺便说一句,如果你正在制作很多Tool实例,请记住使用Tool的原型来定义函数,这样你的代码就会更有内存效率,如下所示:

function Tool(){
    var testA;
}
Tool.prototype.init = function(){
    testA = 1;
    this.testB = 9;
}
Tool.prototype.getTestA = function(){  return testA; }