2012-06-13 2 views
1

в следующем примере, чтобы отправить в качестве параметра объект «lostThis» метода «instObj», «this» - это оконный объект.Сохраните это в методе, переданном по ссылке

var obj = function() {}; 
obj.prototype.lostThis = function() { 
    console.log('lostThis', this instanceof obj, this); 
}; 

var instObj = new obj; 

var caller = { 
    runFn: function(fn) { 
     fn(); 
    } 
}; 

caller.runFn(instObj.lostThis); 

Консоль ответа:

lostThis false Window 

run example

В следующем примере (чуть более сложным) существуют различные способы, чтобы вызывать методы «instObj», где это то же самое, и другие где я могу сохранить «этот» объект.

var obj = function() {}; 

obj.prototype.methodRefHasThis = function() { 
    var t = this; 
    return function() { 
     console.log('methodRefHasThis ', t instanceof obj, t); 
    }; 
}; 

obj.prototype.methodRefLostThis = function() { 
    console.log('methodRefLostThis ', this instanceof obj, this); 
}; 

obj.prototype.methodRefMaybeThis = function() { 
    console.log('methodRefMaybeThis ', this instanceof obj, this); 
}; 

var instObj = new obj; 
var caller = { 
    runFn: function(fn) { 
     fn(); 
    } 
}; 

// width jQuery 
$('button') 
    .bind('click', instObj.methodRefHasThis()) 
    .bind('click', instObj.methodRefLostThis); 

caller.runFn(instObj.methodRefHasThis()); 
caller.runFn(instObj.methodRefLostThis); 
caller.runFn(function() { 
    instObj.methodRefMaybeThis(); 
});​ 

Console Ответ:

methodRefHasThis true obj 
methodRefLostThis false Window 
methodRefMaybeThis true obj 

methodRefHasThis true obj 
methodRefLostThis false <button>​press here​</button>​ 

run example

Я понимаю, что это происходит с JQuery, чтобы назначить метод к событию, но не мог я вызвать метод "methodRefLostThis" не проигрывают " этот «объект, который будет передан по ссылке?

благодаря

Решение по @am_not_i_am, @Dan_Davies_Brackett и @Ben_Lee

var obj = function() {}; 
obj.prototype.lostThis = function() { 
    console.log('lostThis', this instanceof obj, this); 
}; 

var instObj = new obj; 

var caller = { 
    runFn: function(fn) { 
     fn(); 
    } 
}; 

caller.runFn(instObj.lostThis.bind(instObj)); 
caller.runFn($.proxy(instObj.lostThis, instObj)); 

Консоль ответа:

lostThis true obj 
lostThis true obj 

​ 

run example

ответ

0

Если вы не хотите использовать один из методов, которые вы нашли на работу, вы можете использовать Function.prototype.bind связать контекст вызова к новой функции ...

caller.runFn(instObj.lostThis.bind(instObj)); 

Это возвращающему новая функция, которая при вызове будет устанавливать вызывающий контекст на все, что вы передали, в качестве первого аргумента .bind().

Любые дополнительные аргументы, переданные .bind(), будут установлены как фиксированные аргументы возвращенной функции.

+0

Woops! Благодарим за редактирование @andres descalzo. –

2

Вы можете использовать bind для привязки объекта к this в вызываемом. Например:

caller.runFn(instObj.lostThis.bind(this)); 

Здесь this в точке метод запуска будет переведен в this в lostThis.

2

Существует два способа решить эту проблему. Либо вы можете сделать локальную ссылку на this (я обычно называю это self), а затем используйте метод self. вместо this. внутри метода или вы можете использовать привязку функций.

Бен Ли дал возможность JS5 сделать привязку; jQuery.proxy является альтернативой для браузеров, которые не поддерживают Function.bind.

Смежные вопросы