Javascript 什么';这段代码中变量“tmp”的用途是什么?
我很难理解以下代码中变量Javascript 什么';这段代码中变量“tmp”的用途是什么?,javascript,aop,Javascript,Aop,我很难理解以下代码中变量tmp的意义: $.extend($.Widget.prototype, { yield: null, returnValues: { }, before: function(method, f) { var original = this[method]; this[method] = function() { f.apply(this, arguments); re
tmp
的意义:
$.extend($.Widget.prototype, {
yield: null,
returnValues: { },
before: function(method, f) {
var original = this[method];
this[method] = function() {
f.apply(this, arguments);
return original.apply(this, arguments);
};
},
after: function(method, f) {
var original = this[method];
this[method] = function() {
this.returnValues[method] = original.apply(this, arguments);
return f.apply(this, arguments);
}
},
around: function(method, f) {
var original = this[method];
this[method] = function() {
var tmp = this.yield;
this.yield = original;
var ret = f.apply(this, arguments);
this.yield = tmp;
return ret;
}
}
});
为什么不简单地使用函数局部变量var-yield
,并在around
方法中完全忽略tmp
?它有什么用途?这是一种常见的设计模式吗
感谢您的提示。显然,该代码来自,它提供了一些有用的上下文。那篇文章称之为代码的源代码。但是,原始版本没有
tmp
变量
我喜欢添加tmp
,因为它避免了原始代码的副作用。考虑周围函数应该如何使用:
YourWidgetObject.existingWidgetClass("around", "click", function(){
console.log("before"); //or any code that you want executed before all clicks
yield(); // executes existing click function
console.log("after"); //or any code that you want executed after all clicks
}
无论是否使用tmp
杂耍,这都将按预期工作。单击事件现在将在事件前后执行您的额外代码
但是如果不使用tmp
还原yield
,对象的公共方法yield
现在将被重新定义。因此,如果有人在使用around
后有一个奇怪的想法,只调用YourWidgetObject.yield()
,它将执行最近应用于的任何现有方法(在本例中,单击)
在请求澄清后添加:
想象一下,您根本不恢复yield
,也不将其设置为null。在上面的代码之后,您可以执行以下操作:
YourWidgetObject.existingWidgetClass("before", "focus", function(){
yield(); // executes existing **click** function
}
yield
现在在焦点上执行单击功能,这是非常意外的行为
您是否可以将yield
设置为null,而不是使用tmp
恢复它?当然,就现在而言,这不会有什么不同。但是,当您可能更改或添加其他方法时,更谨慎的做法是使around
方法不知道当前状态,也就是说,它不必知道yield
在被调用时总是为null
作为旁注,我认为这是一种糟糕的around
方法,因为围绕事件进行处理并不一定是它所做的事情-您可以调用yield
,无论您想调用多少次,或者根本不调用。对于真正的around
方法来说,更明智的做法是接受两个回调,一个在事件之前执行,一个在事件之后执行。这样一来,您首先就不需要公开yield
方法
around: function(method, before, after) {
var original = this[method];
this[method] = function() {
before();
original();
after();
}
}
显然,该代码来自于,它提供了一些有用的上下文。那篇文章称之为代码的源代码。但是,原始版本没有tmp
变量
我喜欢添加tmp
,因为它避免了原始代码的副作用。考虑周围函数应该如何使用:
YourWidgetObject.existingWidgetClass("around", "click", function(){
console.log("before"); //or any code that you want executed before all clicks
yield(); // executes existing click function
console.log("after"); //or any code that you want executed after all clicks
}
无论是否使用tmp
杂耍,这都将按预期工作。单击事件现在将在事件前后执行您的额外代码
但是如果不使用tmp
还原yield
,对象的公共方法yield
现在将被重新定义。因此,如果有人在使用around
后有一个奇怪的想法,只调用YourWidgetObject.yield()
,它将执行最近应用于的任何现有方法(在本例中,单击)
在请求澄清后添加:
想象一下,您根本不恢复yield
,也不将其设置为null。在上面的代码之后,您可以执行以下操作:
YourWidgetObject.existingWidgetClass("before", "focus", function(){
yield(); // executes existing **click** function
}
yield
现在在焦点上执行单击功能,这是非常意外的行为
您是否可以将yield
设置为null,而不是使用tmp
恢复它?当然,就现在而言,这不会有什么不同。但是,当您可能更改或添加其他方法时,更谨慎的做法是使around
方法不知道当前状态,也就是说,它不必知道yield
在被调用时总是为null
作为旁注,我认为这是一种糟糕的around
方法,因为围绕事件进行处理并不一定是它所做的事情-您可以调用yield
,无论您想调用多少次,或者根本不调用。对于真正的around
方法来说,更明智的做法是接受两个回调,一个在事件之前执行,一个在事件之后执行。这样一来,您首先就不需要公开yield
方法
around: function(method, before, after) {
var original = this[method];
this[method] = function() {
before();
original();
after();
}
}
暂时的。我猜在f()
中,使用了这个.yield
,它应该指的是original
。是的,您可以使用名为yield
的变量。。。除了yield
是一个(保留的)关键字外,var的名称没有任何意义。f.apply()函数中可能使用this.yield=original。这就是为什么this.yield数据存储在一个临时变量中的原因。为什么不以编写around函数的方式添加到问题中呢?这将使我们更容易指出任何差异。暂时的。我猜在f()
中,使用了这个.yield
,它应该指的是original
。是的,您可以使用名为yield
的变量。。。除了yield
是一个(保留的)关键字外,var的名称没有任何意义。f.apply()函数中可能使用this.yield=original。这就是为什么this.yield数据存储在一个临时变量中的原因。为什么不以编写around函数的方式添加到问题中呢?我反复阅读了你的答案,仍然认为tmp
没有必要。this.yield
以null
开始,并将始终还原为null
,一个人怎么会有一个奇怪的想法而直接调用它呢?你能举个例子来说明这种情况吗?谢谢,判断力很好。对于这样一个包装器来说,这确实是一个漏洞百出的抽象。我反复阅读了你的答案,仍然认为tmp
unnece