如何将匿名函数作为参数传递给现有函数,以便稍后在javascript中使用

How can you pass anonymous functions as parameters to existing functions to use later in javascript?

本文关键字:函数 javascript 参数传递      更新时间:2023-09-26

我正在尝试创建一个基本的javascript框架,您可以将不同的东西传递到其中,包括稍后执行的函数。现在,我正处于一个更简单的测试阶段,但我无法让函数调用正常工作。我的一段代码在这里:

[My JS Fiddle][1]http://jsfiddle.net/mp243wm6/

我的代码有一个包含不同数据的对象,我想稍后调用该方法,但要使用创建时可用的数据。以下是使用传递给对象的函数的函数的代码片段:

clickMe : function() {
        this.obj.click(function() {
            this.func();
        });
    }

欢迎任何我应该阅读的建议或内容。

问题是有两种不同的上下文:

clickMe : function() {
    // here is one
    this.obj.click(function() {
        // here is another
        this.func();
    });
}

您可以简单地将函数作为参数传递,如下所示:

clickMe : function() {
    this.obj.click($.proxy(this.func, this));
}

http://jsfiddle.net/mp243wm6/2/

问题:

考虑到您在JSFiddle中的代码,您有:

onClick : function() {
    this.obj.click(function() {                
        this.func();
    });
},

如前所述,这里有不同的背景。

考虑代码段this.obj.click(function() { this.func(); })。这里的第一个this是对framework.events对象的引用。这里的第二个this是对调用此函数时将成为this的内容的引用。在JSFiddle的情况下,当调用this.func时,this实际上是表示<div id="test">TEST</div>节点的DOM对象。由于它没有func函数,因此在其上调用func()会导致:

未捕获类型错误:未定义不是函数

您必须理解以下内容:您必须传递正确的this,您希望在其中调用函数func

解决方案:

有几种方法可以让它按你的意愿工作:

1.绑定

this.obj.click(this.func.bind(this));

通过这种方式,您可以告诉:"调用我的this.func函数,但请确保它将使用我作为参数传递的this进行调用"。香草JS,没有$.proxy的东西。

JSFiddle

2.带有实际功能参考的副本

onClick : function() {
    var theFunctionReference = this.func;
    this.obj.click(function() {
        theFunctionReference();
    });
},

这样,就不会在framework.events对象的上下文之外依赖this的值。

JSFiddle

问题是它没有绑定到正确的对象。我建议您研究Function.bind(),因为它创建了一个指向正确内容的函数。