Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';这段代码中变量“tmp”的用途是什么?_Javascript_Aop - Fatal编程技术网

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