Javascript t远,因为进程组件没有正确绑定

Javascript t远,因为进程组件没有正确绑定,javascript,Javascript,问题的很大一部分是focus属性。在您的程序中,您将此作为一种最新的操作。关于刚刚发生的事情的独特历史。问题是,您试图以奇怪的方式热交换此值 但是,由于inject的反向应用,需要使用focus属性(以及稍后将看到的其他属性)。在inject模型中构造组件/钩子寄存器的方式要求在方法调用之间保持状态 作为本节的结束说明,过程组件函数定义永远不会返回任何内容。即使你的模型是正确的,你的输入也是有缺陷的handle.generate() 答案 那么我们如何解决这个问题呢?老实说,第一个想法是放弃它。

问题的很大一部分是
focus
属性。在您的程序中,您将此作为一种最新的操作。关于刚刚发生的事情的独特历史。问题是,您试图以奇怪的方式热交换此值

但是,由于
inject
的反向应用,需要使用
focus
属性(以及稍后将看到的其他属性)。在
inject
模型中构造组件/钩子寄存器的方式要求在方法调用之间保持状态

作为本节的结束说明,
过程
组件函数定义永远不会返回任何内容。即使你的模型是正确的,你的输入也是有缺陷的
handle.generate()

答案 那么我们如何解决这个问题呢?老实说,第一个想法是放弃它。在我看来,反向注入模式很难看。
inject
方法所涉及的间接层次从表面上看非常混乱

但那样我们就什么也学不到了,是吗

那么真的,我们该如何解决这个问题呢?好吧,让函数式程序员感到沮丧的是,我们需要保持更多的状态

就其本身而言,我们的
focus
属性无法提供足够的信息来正确更改函数的执行上下文

在我们的
焦点
上,我们需要
字段
(组件/钩子名称)和
片段
(组件对象,如果钩子,则无任何内容)

使用
inject
中的这两个或三个值,我们可以将
依赖项
数组,
绑定到
焦点
,并将结果函数设置回
字段

下一部分的好处是,我们可以通过将组件/钩子的上下文
this
设置为未绑定函数,从而放弃闭包

整个操作如下所示:

var focus = this.focus,
    fragment = this.fragment,
    field = this.field,
    hook = function hook () {
      return this.apply(null, arguments);
    }, func;

dependencies.unshift(focus);
func = Function.prototype.bind.apply(hook, dependencies);

if (fragment) fragment[field] = func;
else this.hooks[field] = func;
这其中的大部分内容应该非常直截了当,但有一部分可能会给人们带来一些问题。需要记住的重要一点是,我们基本上是按顺序创建两个函数,在某种意义上“丢弃”第一个函数。(应该注意的是,这可以通过另一种方式使用
hook.bind.apply
,但它会创建更混乱的代码。这是您可以得到的最优雅的代码。)

首先,我们将我们的
焦点
(我们的原始函数)添加到依赖项列表的前面。现在这很重要

然后我们使用
Function.prototype.apply
调用
Function.prototype.bind
(记住,函数原型方法也共享函数原型方法。几乎所有方法都是海龟)

现在我们将绑定上下文、
hook
和前缀依赖项传递给
apply

hook
用作bind的主机,其上下文
由传递给
apply
的参数数组的第一个元素更改。其余元素将展开以形成
bind
的后续参数,从而创建结果函数的绑定参数

这不是一个非常简单的概念,所以慢慢来

另外需要注意的是,我已经完全删除了
focusComponent
。它的实现在上下文中没有意义。您的模型依赖于最后一次输入注入,因此您需要重新实现
focusComponent
,作为一种简单地调整
焦点
字段
片段
状态的方法

一个小的子补丁是
进程
组件函数。这里不详细介绍。您可以与原始代码进行比较和对比,差异非常明显

JHTML.addComponent('/generate:process',函数(节点){
返回(函数构建(结构、节点){
变量长度=节点。长度、节点、标记;
对于(变量i=0;i}).inject(['/generate:jsonInput'])
您的意思是在
.inject()
中?传递一个数组,然后将其值复制到新数组中。我不知道你指的是不是这个。你最好做一个简化的代码示例,而不是试图描述它的功能。请细化你的问题。问题是,这四个稍大的函数同时使用。因此,我不知道如何在不从我的示例代码中消除问题的情况下分离逻辑。去掉问题和代码中不必要的冗长,就会有更多的人愿意分析它。这并不意味着降低其复杂性。这只意味着扔掉这些垃圾。为了成为一个合适的SO问题,代码应该简化为一个最小的示例,并直接包含在问题中,而不是包含在其他网站上。在代码示例的底部,请仅放几行代码,说明如何调用
Viziion
。准确地描述你的期望和发生的事情。这将有助于说明可以减少哪些。我看到很多字符串操作和错误抛出应该与这个问题无关。谢谢你的时间,我将在两天内+100这个,当我有资格获得赏金时^ ^这确实澄清了我对JS的理解。在阅读了Douglas Crockford的《JavaScript好的部分》之后,这个答案澄清了我读到的一些概念,但第一次并没有真正理解。
JHTML.addHook('generate', function(jsonInput, process) {
   var html = process(jsonInput);
   return html;
}).inject(['/generate:jsonInput', '/generate:process']);

var handle = JHTML.returnUserHandle();

/* HTML Generator Syntax - Client */

console.log(handle.generate());
that.focus = function() {
   that.focus.apply(null, dependencies);
};
function A () {
  var that = this;
  this.prop = 1;
  this.method = function () {
    console.log(that.prop);
  };
}

new A().method();
function A () {
  this.prop = 1;

  this.method = function () {
    console.log(this.prop);
  };
}

new A().method();
function A () {
  this.prop = 1;
}

A.prototype.method = function () {
  console.log(this.prop);
};

new A().method();
new A().method();
// Not great
if (typeof input === 'string') {
  ...
} else throw 'it away';


// Better
if (typeof input !== 'string') throw 'it away';
...
// Not great
for (var i = 0; i < myArray.length; i++) {
  if (myArray[i] > 5) callback(myArray[i]);

  internalArray.push(myArray[i]);
}

// Better
var len = myArray.length, element;

for (var i = 0; i < len; i++) {
  element = myArray[i];

  if (element > 5) callback(element);

  internalArray.push(element);
}
that.focus = function() {
  that.focus.apply(null, dependencies);
};
var focus = this.focus,
    fragment = this.fragment,
    field = this.field,
    hook = function hook () {
      return this.apply(null, arguments);
    }, func;

dependencies.unshift(focus);
func = Function.prototype.bind.apply(hook, dependencies);

if (fragment) fragment[field] = func;
else this.hooks[field] = func;
dependencies.unshift(focus);
func = Function.prototype.bind.apply(hook, dependencies);