2010-01-23 94 views
0

我想知道关于JScript.NET私有变量。请把下列代码看看:JScript.NET私有变量

import System; 
import System.Windows.Forms; 
import System.Drawing; 

var jsPDF = function(){ 
var state = 0; 

var beginPage = function(){ 
    state = 2; 
    out('beginPage'); 
} 

var out = function(text){ 
    if(state == 2){ 
    var st = 3; 
    } 
    MessageBox.Show(text + ' ' + state); 
} 

var addHeader = function(){ 
    out('header'); 
} 

return { 
    endDocument: function(){ 
    state = 1; 
    addHeader(); 
    out('endDocument'); 
    }, 

    beginDocument: function(){ 
    beginPage(); 
    } 
} 
} 

var j = new jsPDF(); 

j.beginDocument(); 
j.endDocument(); 

输出:

beginPage 2 
header 2 
endDocument 2 

,如果我在任何浏览器中运行相同的脚本,输出:

beginPage 2 
header 1 
endDocument 1 

为什么如此??

谢谢, 保罗。

回答

1

只是一个猜测,但看起来JScript.NET不像EMCAScript那样支持闭包,所以endDocument()中的state变量没有引用外部函数的私有成员,而是引用了本地变量(未声明)。奇。

+0

不,他们相信他们支持闭包 - http://blogs.msdn.com/jscript/archive/2007/07/26/scope-chain-of-jscript-functions.aspx – 2010-01-23 23:03:21

0

因为您使用的是单例模式,所以在这里调用jsPDF时不必使用new。 jsPDF返回一个对象字面值,所以即使没有新的,你也可以访问beginPage和endDocument方法。说实在的,我不知道在返回对象字面量的函数上使用new时规范要求什么,所以我不确定JScript.NET是错误还是浏览器。但现在无论是尝试jsPDF(前摆脱新的)或改变功能到这一点:

var jsPDF = function(){ 
var state = 0; 

var beginPage = function(){ 
    state = 2; 
    out('beginPage'); 
}; 

var out = function(text){ 
    if(state == 2){ 
    var st = 3; 
    } 
    MessageBox.Show(text + ' ' + state); 
}; 

var addHeader = function(){ 
    out('header'); 
}; 

this.endDocument = function(){ 
    state = 1; 
    addHeader(); 
    out('endDocument'); 
}; 

this.beginDocument: function(){ 
    beginPage(); 
}; 
} 

这将允许您使用new关键字和创建多个jsPDF对象。

0

我遇到过同样的问题。在下面的代码中,绑定到fun的闭包应该只包含一个名为result的变量。如代码所示,带有一个参数的函数的变量结果似乎与闭包中的结果变量不同。

如果在该函数的行

result = []; 

被去除,然后将结果在线路

return result; 

指结果在封闭。

var fun = function() { 
    var result = []; 
    // recursive descent, collects property names of obj 
    // dummy parameter does nothing 
    var funAux = function(obj, pathToObj, dummy) { 
     if (typeof obj === "object") { 
     for (var propName in obj) { 
      if (obj.hasOwnProperty(propName)) { 
      funAux(obj[propName], pathToObj.concat(propName), dummy); 
      } 
     } 
     } 
     else { 
     // at leaf property, save path to leaf 
     result.push(pathToObj); 
     } 
    } 
    return function(obj) { 
     // remove line below and `result' 3 lines below is `result' in closure 
     result = []; // does not appear to be bound to `result' above 
     funAux(obj, [], "dummy"); 
     return result; // if result 2 lines above is set, result is closure is a different variable 
    }; 
    }();