代码之家  ›  专栏  ›  技术社区  ›  Pavel Podlipensky

jscript.net私有变量

  •  0
  • Pavel Podlipensky  · 技术社区  · 16 年前

    我想知道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
    

    为什么会这样??

    谢谢, 保罗。

    3 回复  |  直到 16 年前
        1
  •  1
  •   richardtallent    16 年前

    只是猜测一下,但是看起来jscript.net不像emcascript那样支持闭包,所以 state enddocument()中的变量没有引用外部函数的私有成员,而是引用一个局部变量(未声明)。奇怪的。

        2
  •  0
  •   Bob    16 年前

    在这里调用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();
     };
    }
    

    这将允许您使用新的关键字并创建多个jspdf对象。

        3
  •  0
  •   John Saunders    16 年前

    我遇到了同样的问题。在下面的代码中,绑定到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
        };
      }();