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

Javascript &引用;这";指向窗口,而不是回调函数后的原型函数

Javascript &引用;这";指向窗口,而不是回调函数后的原型函数,javascript,callback,prototype,this,Javascript,Callback,Prototype,This,我有这个原型功能 (function(window, undefined){ function Waypoint (el, callback, offset){ this.el = el; this.cb = callback; this.offset = offset || 0; window.optimizedScroll.add(this.passedWaypoint); //window.optimi

我有这个原型功能

(function(window, undefined){
    function Waypoint (el, callback, offset){
        this.el = el;
        this.cb = callback;
        this.offset = offset || 0;
        window.optimizedScroll.add(this.passedWaypoint);
        //window.optimizedScroll.add(this.passedWaypoint.call(this)); doesn't work
    }

    Waypoint.prototype.passedWaypoint = function(){
        //if element passes a point execute the callback function
        //this.cb(); //undefined
        console.log(this);  //refers to window and not to my obj
    };

    window.Waypoint = Waypoint;

})(this); 

var myElement1 = new Waypoint("myElement", function(){
    console.log("i have traveled so far");
});
这是从这个页面优化的滚动 (我只更改了滚动调整大小)

当我滚动时,回调函数被执行,但是我对小词“this”有一个问题。我如何才能做到“this”指的是我的obj而不是window。我玩了“呼叫”,但我没有得到它


gregor,@MysterX的评论是正确的;)

不是我试过的“打电话”


谢谢!!;)

传递回调时,使用callback.bind(this)可能会重复
var optimizedScroll = (function(window, undefined) {
    var callbacks = [], running = false;
    // fired on resize event
    function scroll() {
        if (!running) {
            running = true;
            window.requestAnimationFrame(runCallbacks);
        }
    }
    // run the actual callbacks
    function runCallbacks() {
        callbacks.forEach(function(callback) {
            callback(); 
        });
        running = false; 
    }
    // adds callback to loop
    function addCallback(callback) {
        if (callback) {
            callbacks.push(callback);
        }
    }
    return {
        // public method to add additional callback
        add: function(callback) {
            if (!callbacks.length) {
                window.addEventListener('scroll', scroll);
            }
            addCallback(callback);
        }
    };
})(this);
window.optimizedScroll.add(this.passedWaypoint.bind(this));