小编pht*_*ier的帖子

使用jquery创建和删除DOM的对象避免内存泄漏

假设您有一个组件,其工作是创建一些DOM节点(例如,使用jquery):

function PageFiller() {
}
PageFiller.prototype.fillPage = function () {
  this.dom = $("<div/>", {
    "class" : "hello",
    text : "Hello world"
  });
  $("body").append(this.dom);
}
Run Code Online (Sandbox Code Playgroud)

假设另一个组件使用它来填充DOM,而不保留对"PageFiller"的引用

function Main() {
}
Main.prototype.start = function () {
   var filler = new PageFiller();
   filler.fillPage();
};
var main = new Main()
main.start();
Run Code Online (Sandbox Code Playgroud)

不要假设在那之后(在相同的范围内),有人残酷地清除DOM:

$(".hello").remove();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,内存布局是什么?我是否用PageFiller实例泄露了内存?

我有点不确定PageFiller实例将在何时收集垃圾(如果它曾经发生),因为它持有对表示不存在的DOM部分的jquery对象的引用?或者它与DOM无关,因为根据我的理解,实际的 DOM对象生活在与常规JS变量不同的堆中(除非我在这里弄错了..)

更新:如果对主页对象保留对PageFiller的引用,那么事物的变体就是:

Main.prototype.start = function () {
    this.filler = new PageFiller();
    filler.fillPage();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Main对象具有对PageFiller对象的引用,该对象本身包含对JQ对象的引用; 在'remove'之后,JQ对象仍然存在于内存中,但是指向不存在的DOM节点,对吧?

我是否正确地说,在原始示例中,只要main.start()完成:

  • 没有对象持有对PageFiller对象的引用,因此它被垃圾收集,并且pageFiller.dom对象没有被任何人引用,所以它也被垃圾收集了?
  • 实际的DOM元素显然仍然存在于内存中,但在一个单独的堆中,我真的不必担心

其他情况:

这次是一个小变化,事件处理程序使事情变得复杂:

PageFiller.prototype.fillPage = function () {
  var self = …
Run Code Online (Sandbox Code Playgroud)

javascript jquery

5
推荐指数
1
解决办法
1827
查看次数

摆脱子组件对象的"新"运算符

我一直在阅读Misko Hevery 关于依赖注入的经典 文章,基本上是"将对象图创建代码与代码逻辑分离".

主要想法似乎是"摆脱'新'运营商',将它们放入专用对象('工厂')并注入你所依赖的一切."

现在,我似乎无法理解如何使用由几个其他组件组成的对象,并且其工作是将这些组件隔离到外部世界.

跛脚的例子

一个View类,表示几个字段和一个按钮的组合.所有组件都依赖于图形ui上下文,但您希望将其隐藏在每个子组件的接口后面.

所以像(在伪代码中,语言并不重要我猜):


class CustomView() {

   public CustomView(UIContext ui) {
        this.ui = ui
   }

   public void start() {

      this.field = new Field(this.ui);
      this.button = new Button(this.ui, "ClickMe");

      this.button.addEventListener(function () {
           if (field.getText().isEmtpy()) {
              alert("Field should not be empty");
           } else {
              this.fireValueEntered(this.field.getText());
           }
      });
   }

   // The interface of this component is that callers
   // subscribe to "addValueEnteredListener"..)
   public void addValueEnteredListener(Callback ...) {
   }

   public void fireValueEnteredListener(text) {
     // Would call each …
Run Code Online (Sandbox Code Playgroud)

language-agnostic unit-testing dependency-injection

5
推荐指数
1
解决办法
186
查看次数

您如何在Go中建立tls.Certficate链?

我正在尝试配置TLS服务器以在连接时返回证书

我想创建一个带有证书tls.Config

    // Certificates contains one or more certificate chains
    // to present to the other side of the connection.
    // Server configurations must include at least one certificate
    // or else set GetCertificate.
    Certificates []Certificate
Run Code Online (Sandbox Code Playgroud)

假设我的链为root -> inter -> server,我可以独立加载每个证书,并使用一个列表,但是只有serverCert发送到SSL客户端。

我正在按照以下方式进行操作:

root, err := tls.LoadX509KeyPair("root.crt", "root.key")
inter, err := tls.LoadX509KeyPair("inter.crt", "inter.key")
server, err := tls.LoadX509KeyPair("server.crt", "server.key")

config := tls.Config{
   Certificates : []tls.Certificates{root, inter, server}
}
config.BuildNameFromCertificates()
Run Code Online (Sandbox Code Playgroud)

我是否缺少明显的东西?顺序重要吗?

ssl go

5
推荐指数
1
解决办法
462
查看次数

om组件应该返回什么不呈现?

是否可以编写一个不呈现任何内容的组件,例如,如果其游标数据为空?

我不能做

(defn count-or-nothing [list-cursor owner]
  (reify
    om/IRender
    (render [_]
       (if (not (empty? list-cursor))
         (dom/div nil "You have some elements !")))))
Run Code Online (Sandbox Code Playgroud)

if子句返回nil,这会导致错误消息

未捕获的错误:不变违规:ReactCompositeComponent.render():必须返回有效的ReactComponent.您可能已返回null,undefined,数组或其他一些无效对象.

我通过渲染空的跨度,但听起来很笨拙.我是否必须重构我的代码并将测试"排除"在此组件之外?

clojurescript om

4
推荐指数
1
解决办法
1928
查看次数

您可以从现有类型中创建更小,更受限制的类型吗?

假设我有以下类型声明:

type Foo = 'a' | 'b' | 'c';
type Bar = 'a' | 'b' ;
Run Code Online (Sandbox Code Playgroud)

是否可以表示Bar为的子集Foo

我知道始终可以将表示Foo为的超集Bar,但就我而言,反过来会感觉更符合领域。

types typescript

4
推荐指数
1
解决办法
61
查看次数

具有直接C兼容性的语言

除了C++之外,哪些非玩具语言与C 具有直接或易于使用的兼容性? 就像在"我可以在那里使用一个C库,并编译我的代码而不必查找,编写或配置某种包装器."

我知道很多语言通过某种形式的外部调用或绑定与C兼容(我一直在Java,Ruby,Python等中使用绑定,所以我知道它可以完成).但是你依赖某人(可能是你)来编写和维护你想要使用的所有库的绑定,并且绑定必须适用于所有平台,等等.

比C++更具表现力的语言有这个功能吗?

感谢所有人提到swig或相关的包装生成工具.我知道那些存在,但我不认为它们真的像C-> C++集成一样容易......但是然后与C集成可能是C++中唯一更容易的东西;))

c c++

3
推荐指数
2
解决办法
450
查看次数

使用ant mxmlc任务将runtime-library-path添加到flex构建配置

我正在尝试构建一个flex项目,将其链接到一些RLS.在Flex Builder中设置项目时,相应的"构建配置"(我通过将-dump-config添加到编译器选项中获得)生成(以及其他)标记,如下所示:

<runtime-shared-libraries>
  <url>some-lib.swf</url>
  <url>some-other-lib.swf</url>
</runtime-shared-libraries>
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试使用mxmlc ant任务构建项目,但我似乎无法添加对共享库的任何引用.我认为这样的事情会有所帮助,但它没有:

<!-- Skipping attributes that I don't think are relevant ... -->
<mxmlc ....>
 ...
 <runtime-shared-library-path>
<url rsl-url="some-lib.swf"></url>
<url rsl-url="some-other-lib.swf"></url>
 </runtime-shared-library-path>
</mxmlc>
Run Code Online (Sandbox Code Playgroud)

那么我在这里可以缺少什么呢?

谢谢

apache-flex ant mxmlc

3
推荐指数
1
解决办法
5771
查看次数

你能查找向量的元素并更改它吗?

假设我有这些结构(没有花哨的指针,一切都是可复制的)

\n
#[derive(Debug, Copy, Clone)]\nstruct Item {\n    id: u32,\n    pub value: u32\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我可以创建一个结构来保存此类项目的 vec:

\n
#[derive(Debug)]\nstruct Container {\n    next_id: u32,\n    items: Vec<Item>\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果您知道确切的位置,添加元素和更改它们相当容易:

\n
#[derive(Debug, Copy, Clone)]\nstruct Item {\n    id: u32,\n    pub value: u32\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这使得这样的测试通过:

\n
    #[test]\n    fn can_change_first() {\n        let mut c = Container::new();\n        assert_eq!(c.add(), 0);\n        c.change_first(22);\n        assert_eq!(c.lookup(0).unwrap().value, 22);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

但是,假设我想查找和元素并找到它。我不想items直接公开 vec,但建议使用一个 API 来这样做:

\n
 #[test]\n    fn can_lookup_and_change() {\n        let mut c = Container::new();\n        assert_eq!(c.add(), 0);\n        c.change_at(0, 22);\n        assert_eq!(c.lookup(0).unwrap().value, 22);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

na\xc3\xafve …

rust

0
推荐指数
1
解决办法
63
查看次数