Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.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中从内部回调访问外部回调的最短方法?_Javascript_Callback_This Keyword - Fatal编程技术网

什么是最简单的&;在javascript中从内部回调访问外部回调的最短方法?

什么是最简单的&;在javascript中从内部回调访问外部回调的最短方法?,javascript,callback,this-keyword,Javascript,Callback,This Keyword,我知道以下代码可以访问此外部。 var o = function() { var that = this; this.a = 1; $('html').click(function() { alert(that.a); }); } new o(); 但是我不想对同一个对象使用两个变量名(例如,this和that)。 我不想在每个类上重复写var that=this。 我认为下面使用this而不是that的代码稍微简单一点。 var o =

我知道以下代码可以访问此外部。


var o = function() {
    var that = this;
    this.a = 1;
    $('html').click(function() {
        alert(that.a);
    });
}
new o();
但是我不想对同一个对象使用两个变量名(例如,this和that)。
我不想在每个类上重复写
var that=this


我认为下面使用this而不是that的代码稍微简单一点。


var o = function() {
    var _this = this;
    this.a = 1;
    $('html').click(function() {
        alert(_this.a);
    });
}
new o();
但是还有其他更简单、更短的方法吗?


这里有一些类似的代码,但我相信它“更安全” 如果您创建了多个“o”实例,则 每个实例都可以更新“a”属性

var bar = function() {
        var that = {};
        that.a = 1;
        that.showA = function () {
            $('html').click(function() {
                alert(that.a);
            });
        };
        return that;
}
var instanceOfBar = bar();
instanceOfBar.showA();

我可能在这里有点不对劲,已经有几个月没有使用javascript了,所以现在生锈了

我真的很喜欢Ext的
createDelegate
函数,它让你在创建任何函数时设置
这个

下面是一个功能性较差的
createDelegate
版本,您可以将其包含在页面中:

Function.prototype.createDelegate = function(thisObj) {
    var method = this;
    return function() {
        return method.apply(thisObj || window, arguments);
    };
}
下面是如何在示例中使用它,不要将
this
设置为变量:

var o = function() {
    this.a = 1;
    $('html').click(function() {
        alert(this.a);
    }.createDelegate(this));
}
new o();

Ext的完整版本
createDelegate
让我们将参数作为第二个参数传入,它们可以用来代替插入,或者附加到参数列表中,这些参数将定期传递到您正在创建其委托的函数中

我看不出这比那更简单,同意,“那”似乎是标准方式,为什么要反抗?我很抱歉,但我认为这个比那个简单,因为这个.a和这个.a都可以用这个来搜索。如果我用它代替这个,我必须用它搜索两次。我不想搜索两次。每个实例如何更新“a”属性?我认为新操作符为每个实例提供了它自己的属性,并且它们从不被彼此更新。但是用它来代替这个很简单。谢谢。啊,是的,你是对的,我在读了“Javascript:the good parts”之后就不再尝试使用新关键字了,这篇文章对新关键字的使用有一些有趣的评论-谢谢你介绍这篇有趣的文章。我真的不知道我应该使用新的还是还没有,因为我缺乏对原型的理解。在我看来,只使用<代码>的代码比使用三个关键字的代码更简单(
)。但是我认为只使用
that
是解决从内部回调函数访问外部
this
的问题的非常好的方法。因此,我将编写
var=this;a=1/*不是这个。a=1*/*并且不返回那个(使用new来实例化)*/