【问题标题】:Javascript revealing module pattern NoobJavascript 揭示模块模式 Noob
【发布时间】:2013-01-12 13:18:24
【问题描述】:

我正在启动 Addy Osmani 的 amazing book on javascript design patterns,但似乎无法启动。谁能告诉我我的方法有什么问题(我正在使用 Raphael,只是为了好玩。):

var myPaper = Raphael('container', '800', '600');

var myScene = function() {
  var c1 = myPaper.circle(50, 50, 40);
  var c2 = myPaper.circle(50, 150, 40);
  var c3 = myPaper.circle(50, 250, 40);

  c2.attr("fill", "red");  // yep!

  return {
      firstCircle: c1
  };
}

// at some point later i want to call the function...
myScene();

//  ...then even later I want to refer to one of the circles
//  but without creating another global variable.

myScene.firstCircle.attr("fill", "red");  // nope!
console.log(myScene.firstCircle); //  undefined!

http://jsfiddle.net/aGCv8/

【问题讨论】:

  • 你没有在任何地方定义 var circ1,只是 c1
  • @domonic 对,这是一个错字。不过不是问题……我修好了。

标签: javascript module-pattern revealing-module-pattern


【解决方案1】:

“你的方法有什么问题”是this isn't the module pattern,无论是揭示还是其他。如果您打算使用它,使用它, 并使该函数自调用:

var myScene = function() {
  var c1 = myPaper.circle(50, 50, 40);
  var c2 = myPaper.circle(50, 150, 40);
  var c3 = myPaper.circle(50, 250, 40);

  c2.attr("fill", "red");  // yep!

  return {
      firstCircle: c1         // ← refer to a variable which is actually defined
  };
}();                          // ← parens go here

以后不要将myScene 作为函数调用,因为它不是函数,并且该匿名函数已被调用。看,你仍然可以访问那个圈子!

console.log(myScene.firstCircle); // z {0: circle.[object SVGAnimatedString], node: circle.[object SVGAnimatedString], id: 0, matrix: cb, realPath: null, paper: j…}

如您所见,省略括号(调用匿名函数)会导致非常不同的结果。

http://jsfiddle.net/mattball/qR4Fj/

【讨论】:

  • 非常感谢马特。问题是,我实际上确实希望以后能够使用公共指针调用该函数。当我重构你的代码来做到这一点时,我遇到了类似的问题:jsfiddle.net/wUbG2
  • 为什么希望以后可以调用?一个模块应该是一个函数;它是相关功能的独立逻辑单元。如果您希望它可重用并应用于页面上的不同位置,请不要创建/使用模块。创建并使用一个类。
  • 好吧,它稍后会根据一堆条件因素调用。 (为了示例,我大大简化了。)它不需要可重用或多次调用。不要在这里跑题,而且:我对 javascript 的理解是没有类。我真的只是想弄清楚为什么 myScene.secondCircle 在第二把小提琴中返回 undefined ......
  • myScene.secondCircle 未定义,因为在返回定义 renderCirclessecondCircles 的对象时,c2undefined。而且肯定有课! developer.mozilla.org/en-US/docs/JavaScript/…
  • 哦,伙计,我知道你会去那里。我非常感谢您的帮助,但是关于计算机科学中“类”性质的学术辩论现在并没有真正帮助我:) FWIW,因为我相信您知道这里有关于术语的辩论:stackoverflow.com/questions/2752868/… 如果renderCircles() 已经运行了,这不是定义 c2 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多