将 noop 分配给变量
Assigning noop to a variable
我正在研究 Angular utils 源代码,刚好遇到以下行:
export const NOOP: any = () => {};
嗯,以上是显而易见的。声明一个不做任何操作的变量。
现在在同一个库中,我有以下方法:
export function resolveViewDefinition(factory: ViewDefinitionFactory): ViewDefinition {
let value: ViewDefinition = VIEW_DEFINITION_CACHE.get(factory) !;
if (!value) {
value = factory(() => NOOP);
value.factory = factory;
VIEW_DEFINITION_CACHE.set(factory, value);
}
return value;
}
如果不保留该行并将其注释掉并使块如下所示,会产生什么影响:
if (!value) {
// value = factory(() => NOOP);
value.factory = factory;
VIEW_DEFINITION_CACHE.set(factory, value);
}
有人可以详细说明这一行:
value = factory(() => NOOP);
并在上面放更多的灯?我可以看到发生了什么,但我无法理解消除它的影响。
resolveViewDefinition
函数用于获取视图定义。首先,它尝试从缓存中获取 value
,如果没有缓存值,则它会调用 ViewDefinitionFactory
.
ViewDefinitionFactory
将函数作为参数。为什么?
/**
* Factory for ViewDefinitions.
* We use a function so we can reexecute it in case an error happens and use the given logger
* function to log the error from the definition of the node, which is shown in all browser
* logs.
*/
export interface ViewDefinitionFactory { (logger: NodeLogger): ViewDefinition; }
当我们刚得到 ViewDefinition
时,我们不需要记录错误,所以它是用 NOOP
函数调用的。
但是当我们在模板中执行某些操作时出错时 angular 是 运行 这个工厂 NodeLogger
以确定哪个节点导致了错误。
让我们看例子Plunker
@Component({
selector: 'my-app',
template: `<h2 (click)="x()">Hello</h2>`
})
export class App {}
这里是工厂
function View_App_0(l) {
return jit_viewDef1(0,[
(l()(),jit_elementDef2(0,null,null,1,'h2',[],null,[[
null,
'click'
]
],function(v,en,$event) {
var ad = true;
var co = v.component;
if (('click' === en)) {
var pd_0 = (co.x() !== false);
ad = (pd_0 && ad);
}
return ad;
},null,null)),
(l()(),jit_textDef3(null,['Hello']))
]
,null,null);
}
1) 运行 申请
function resolveViewDefinition(factory) {
var value = ((VIEW_DEFINITION_CACHE.get(factory))); // we haven't cached it yet
if (!value) { // value is undefined
value = factory(function () { return NOOP; }); //get ViewDefinition but do not log errors
value.factory = factory; // save link to the factory so it can be used later
VIEW_DEFINITION_CACHE.set(factory, value); // store factory
}
return value;
}
2) 点击后Hello
((logViewDef.factory))(nodeLogger); // use saved link to call factory with logger
我正在研究 Angular utils 源代码,刚好遇到以下行:
export const NOOP: any = () => {};
嗯,以上是显而易见的。声明一个不做任何操作的变量。 现在在同一个库中,我有以下方法:
export function resolveViewDefinition(factory: ViewDefinitionFactory): ViewDefinition {
let value: ViewDefinition = VIEW_DEFINITION_CACHE.get(factory) !;
if (!value) {
value = factory(() => NOOP);
value.factory = factory;
VIEW_DEFINITION_CACHE.set(factory, value);
}
return value;
}
如果不保留该行并将其注释掉并使块如下所示,会产生什么影响:
if (!value) {
// value = factory(() => NOOP);
value.factory = factory;
VIEW_DEFINITION_CACHE.set(factory, value);
}
有人可以详细说明这一行:
value = factory(() => NOOP);
并在上面放更多的灯?我可以看到发生了什么,但我无法理解消除它的影响。
resolveViewDefinition
函数用于获取视图定义。首先,它尝试从缓存中获取 value
,如果没有缓存值,则它会调用 ViewDefinitionFactory
.
ViewDefinitionFactory
将函数作为参数。为什么?
/**
* Factory for ViewDefinitions.
* We use a function so we can reexecute it in case an error happens and use the given logger
* function to log the error from the definition of the node, which is shown in all browser
* logs.
*/
export interface ViewDefinitionFactory { (logger: NodeLogger): ViewDefinition; }
当我们刚得到 ViewDefinition
时,我们不需要记录错误,所以它是用 NOOP
函数调用的。
但是当我们在模板中执行某些操作时出错时 angular 是 运行 这个工厂 NodeLogger
以确定哪个节点导致了错误。
让我们看例子Plunker
@Component({
selector: 'my-app',
template: `<h2 (click)="x()">Hello</h2>`
})
export class App {}
这里是工厂
function View_App_0(l) {
return jit_viewDef1(0,[
(l()(),jit_elementDef2(0,null,null,1,'h2',[],null,[[
null,
'click'
]
],function(v,en,$event) {
var ad = true;
var co = v.component;
if (('click' === en)) {
var pd_0 = (co.x() !== false);
ad = (pd_0 && ad);
}
return ad;
},null,null)),
(l()(),jit_textDef3(null,['Hello']))
]
,null,null);
}
1) 运行 申请
function resolveViewDefinition(factory) {
var value = ((VIEW_DEFINITION_CACHE.get(factory))); // we haven't cached it yet
if (!value) { // value is undefined
value = factory(function () { return NOOP; }); //get ViewDefinition but do not log errors
value.factory = factory; // save link to the factory so it can be used later
VIEW_DEFINITION_CACHE.set(factory, value); // store factory
}
return value;
}
2) 点击后Hello
((logViewDef.factory))(nodeLogger); // use saved link to call factory with logger