2012-11-09 84 views
-1

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

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(){ 
} 

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

+0

它应该。问题是,你想要做什么?你的代码意味着什么。 – iMoses

+3

这里没有足够的代码来说明究竟发生了什么。如何调用init?你如何尝试访问'test'? – josh3736

+0

“工作”是什么意思? –

回答

2

很简单。您的Tool实例没有init方法。代码中的init函数仅是Tool构造函数的本地函数。 Tool实例不会继承此类功能。

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

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

    function Tool() { 
        this.init = function() { ... }; 
    } 
    
  2. 或指定给Tool.prototype(外):

    Tool.prototype.init = function() { ... }; 
    

第二个选项表现更好,因为所有实例都共享相同的功能init函数。 (在第一个选项中,每个实例都会在构造函数调用期间创建它自己的init函数。)

+0

虽然这对他的示例代码来说肯定是个问题,但我认为问题是关于init内部的可变参数,而他忽略了不正确的函数定义。 – DSKrepps

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是公开的。

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

顺便说一句,如果你做了很多工具的情况下的,记得使用工具的原型定义函数来代替,所以你的代码是更多的内存效率,就像这样:

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