了解button.js中的$ .proxy函数

时间:2015-01-25 22:56:17

标签: javascript jquery

正在通过twitter bootstrap button.js代码和代码编写一些对我来说真的没有意义的代码,所以我在这里请求你们帮助,如果你们中的任何一个人都很友好向我解释这段代码的含义,它会很棒。

好吧,这是很难理解的代码,

setTimeout($.proxy(function () {
  if (state == 'loadingText') {
    this.isLoading = true
    $el.addClass(d).attr(d, d)
  } else if (this.isLoading) {
    this.isLoading = false
    $el.removeClass(d).removeAttr(d)
  }
}, this), 2000)

现在我在jquery中了解代理功能。在doc's我看到以下示例:

$(document).ready(function(){
                        var me = {
                        // I'm a dog
                        type: "dog",
                        // Note that event comes *after* one and two
                        test: function( one, two, event ) {
                        $( "#log" )
                        // `one` maps to `you`, the 1st additional
                        // argument in the $.proxy function call
                        .append( "Hello " + one.type + ":" )
                        // The `this` keyword refers to `me`
                        // (the 2nd, context, argument of $.proxy)
                        .append( "I am a " + this.type + ", " )
                        // `two` maps to `they`, the 2nd additional
                        // argument in the $.proxy function call
                        .append( "and they are " + two.type + "." )
                        // The event type is "click"
                        .append( "Thanks for " + event.type + "ing." )
                        // The clicked element is `event.target`,
                        // and its type is "button"
                        .append( "the " + event.target.type + "." );
                        }
                        };
                        var you = { type: "cat" };
                        var they = { type: "fish" };
                        // Set up handler to execute me.test() in the context
                        // of `me`, with `you` and `they` as additional arguments
                        var proxy = $.proxy( me.test, me, you, they );
                        $( "#test" ).on( "click", proxy );
                });

现在显然代理正在doc中列出的示例中传递4个参数,但是我没有看到在button.js代码中的代理函数中发生了什么?为什么?

我知道代理在javascript中有点像prototype.bind或prototype.call,可以用来改变给定函数调用的上下文,但是button.js中的这段代码对我来说仍然没有意义并且对于像我这样的新手开发来说似乎过于复杂,如果有人能理解我在button.js中找到的这段代码,我真的很感激。

谢谢。

亲切的问候。 亚历山大。

1 个答案:

答案 0 :(得分:1)

在javascript中,无论函数需要多少参数,都可以向函数传递任意数量的参数。如果您注意到,它甚至表明它在jQuery网站的文档中接受了其他参数:

http://api.jquery.com/jquery.proxy/#jQuery-proxy-context-name-additionalArguments

如此有效,Bootstrap人员只是将额外的参数传递给执行范围,这些参数在范围内是不可用的。