1

再会!

几天前,我开始编写自己的基本 JavaScript 库供个人使用和分发,但我在使用其中一种方法时遇到了问题,特别是bind()

在方法本身中,this指的是库、对象。

我去谷歌找到了function.call(),但它并没有按照我计划的方式工作——它只是执行了这个函数。

如果您看一下另一种方法each(),您会发现它使用call()来传递值。

我还尝试了以下方法:

f.arguments[0]=this;

我的控制台抛出一个错误,说它无法读取“未定义”的“0”。

我希望能够通过这个(引用库——不是窗口)在事件监听器中使用它。

您可以从这个 JSFiddle的 JavaScript 的第 195 行开始看到它。

这里也是:

bind:function(e,f){
    if(e.indexOf("on")==0){
        e=e.replace("on","");
    }
    if(typeof f==='function'){
            /*Right now, 'this' refers to the library
            How can I pass the library to the upcoming eventListener?
            */
            //f=f(this); doesn't work
            //f.call(this); //doesn't work

            //this.target refers to the HTMLElement Object itself, which we are adding the eventListener to
        //the outcome I'm looking for is something like this:
        /*$('h3').which(0).bind(function({
            this.css("color:red");
        });*/
        //(which() defines which H3 element we're dealing with
        //bind is to add an event listener
            this.target.addEventListener(e,f,false)
    }
    return this;
},

非常感谢您的帮助,贡献者!

4

3 回答 3

1

如果根据您的评论,您不想使用.bind(),而不是直接传递faddEventListener()您,可以传递另一个函数,该函数又f使用.call()or调用.apply()

if(typeof f==='function'){
    var _this = this;
    this.target.addEventListener(e,function(event){
        f.call(_this, event);
    },false)
}

这样做还可以让您的库执行任何额外的事件管理,例如,对event对象进行预处理以规范不同浏览器的不同属性。

于 2013-07-07T22:24:08.783 回答
1

因此,在这种特殊情况下,您实际上想要调用所有函数都具有的 JavaScript 内置绑定方法。

f = f.bind(this);

f将是一个新函数,其this参数设置为您传递给它的任何内容。

于 2013-07-07T22:12:22.943 回答
0

替换f=f(this);f.apply(this);

看下划线代码,这里: https ://github.com/jashkenas/underscore/blob/master/underscore.js#L596

于 2013-07-07T22:52:45.447 回答