我想知道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为什么会这样呢?
谢谢,保罗。
发布于 2010-01-24 05:40:42
这只是一种猜测,但看起来JScript.NET不像EMCAScript那样支持闭包,因此endDocument()中的state变量不是引用外部函数的私有成员,而是引用一个局部变量(未声明)。很奇怪。
发布于 2010-02-12 06:51:54
在这里调用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对象。
发布于 2010-03-14 00:57:58
我也遇到过同样的问题。在下面的代码中,绑定到fun的闭包应该只包含一个名为result的变量。如代码所示,只有一个参数的函数中的变量result似乎与闭包中的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
};
}();https://stackoverflow.com/questions/2124681
复制相似问题