首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JScript.NET私有变量

JScript.NET私有变量
EN

Stack Overflow用户
提问于 2010-01-24 04:53:21
回答 3查看 257关注 0票数 0

我想知道JScript.NET私有变量。请看下面的代码:

代码语言:javascript
复制
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();

输出:

代码语言:javascript
复制
beginPage 2
header 2
endDocument 2

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

代码语言:javascript
复制
beginPage 2
header 1
endDocument 1

为什么会这样呢?

谢谢,保罗。

EN

回答 3

Stack Overflow用户

发布于 2010-01-24 05:40:42

这只是一种猜测,但看起来JScript.NET不像EMCAScript那样支持闭包,因此endDocument()中的state变量不是引用外部函数的私有成员,而是引用一个局部变量(未声明)。很奇怪。

票数 1
EN

Stack Overflow用户

发布于 2010-02-12 06:51:54

在这里调用jsPDF时不必使用new,因为您使用的是单例模式。jsPDF将返回一个对象字面量,因此即使没有新增,您也可以访问beginPage和endDocument方法。老实说,我不知道在返回对象字面量的函数上使用new时的规范要求是什么,所以我不确定是JScript.NET搞错了还是浏览器搞错了。但是现在试着去掉jsPDF()之前的新函数,或者把你的函数改成这样:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-03-14 00:57:58

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

如果在此函数中,行

代码语言:javascript
复制
   result = [];

被移除,则该行中的结果

代码语言:javascript
复制
  return result;

是指闭包中的结果。

代码语言:javascript
复制
  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
    };
  }();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2124681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档