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);