Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.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_Object_Callback - Fatal编程技术网

javascript:从回调函数调用对象内部的函数

javascript:从回调函数调用对象内部的函数,javascript,object,callback,Javascript,Object,Callback,当我试图从回调函数中使用“this”调用对象内部的函数时,会出现一个错误,表示该方法未定义。 我怎样才能解决这个问题 var object_log = { user: "", pass: "", error_message: "an error occured while connecting", init: function(user, pass) { this.user = user; this.pass = pass;

当我试图从回调函数中使用“this”调用对象内部的函数时,会出现一个错误,表示该方法未定义。 我怎样才能解决这个问题

 var object_log = {
    user: "",
    pass: "",
    error_message: "an error occured while connecting",
    init: function(user, pass) {
        this.user = user;
        this.pass = pass;
    },
    login: function() {
        remote_submit(identify, this.success, this.error);
    },
    error: function() {
        alert(this.error_message);
    },
    success: function() {
        alert("success");
    }
};

将函数作为回调传递时,请执行以下操作:

  whatever( object_log.login.bind( object_log ) );
调用
.bind
方法将返回一个函数,该函数将确保调用“login”函数,从而
引用“object\u log”对象


.bind
对于较旧的浏览器有一个很好的垫片

您需要在回调上使用
.call()
.apply()
方法来指定调用该方法的上下文

回调方法
remote\u submit
不知道这个
将是什么,因此当它调用回调方法时,它们会像普通函数一样执行,而不是在对象上执行

您可以通过在退出时包装函数来“绑定”函数:

var self = this;
remote_submit(
  identify,
  function() { return self.success.apply(self, arguments); },
  function() { return self.error.apply(self, arguments); }
);
这允许您在匿名函数的闭包中传递上下文,并使用独占的
This
上下文执行回调

在EMCAScript5+中,您可以在函数上使用
bind
,将其绑定以在回调中使用:

remote_submit(identify, this.success.bind(), this.error.bind())
然而,从以下方面来看:

绑定功能是ECMA-262第5版的最新添加;因此,它可能不会出现在所有浏览器中。您可以通过在脚本的开头插入以下代码来部分解决这个问题,允许在本机不支持bind()的实现中使用bind()的大部分功能

垫片/聚填充物位于此处:

if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      // closest thing possible to the ECMAScript 5 internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP && oThis
                                 ? this
                                 : oThis,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}

更新

要回答您的其他问题,让我们首先查看和文档,并详细分析它们的工作原理:

从根本上说,它们的工作原理相同,唯一的区别在于它们如何看待自己的论点:

myfunc.call(target, param1, param2, param3);
将调用
myfunc(param1、param2、param3)
并将
目标作为

var args = [param1, param2, param3];
myfunc.apply(target, args);
将调用
myfunc(param1、param2、param3)
并将
目标作为

var args = [param1, param2, param3];
myfunc.apply(target, args);
基本上区别在于
.apply()
接受一个参数数组,其中
调用
函数要求您在代码中写入参数

接下来,如果我们看一下我给你的例子:

function() { return self.success.apply(self, arguments); }
这将返回一个函数,该函数通过将传递到匿名函数的所有参数(
arguments
variable)传递到
apply
函数来调用回调函数。因此:

var a = function() { return self.success.apply(self, arguments); };
a(1,2,3,4);
这将调用
self.success(1,2,3,4)
with
self
as
This
。如果您希望使用特定的内容来扩充参数,例如,如果您希望
a(1,2,3,4)
调用
self.success(self.test,1,2,3,4)
,则必须为
apply
函数提供一个扩充数组:

var a = function() {
  var args = [self.test];
  for(var i = 0; i < arguments.length; i++) args[] = arguments[i];
  return self.success.apply(self, args);
}
var a=function(){
var args=[self.test];
对于(var i=0;i
这个.success的定义在哪里?我的代码太长了,因为我创建了一个示例。很抱歉,让我编辑itI没有否决投票,但是
bind
仅在EMCASCript5+中可用,这可能是一个问题,取决于浏览器,这可能是原因。@它在所有现代浏览器中都可用,并且有一个很好的垫片-我将为此添加参考。不幸的是,我们中的很多人都无法支持IE8,我给了你一票反对-1,因为你是正确的。非常感谢,你帮了我很大的忙。请回答另一个问题:是否有发送其他数据的方法。类似这样的例子:function(){self.success.apply(self,“Hello”,arguments);},