2014-02-13 1 views
1
событие

моего JQuery выглядит следующим образом:объем этого в функции обратного вызова Jquery в

$('body').on('click', '.show-it', function (e) { 
     e.preventDefault(); 
     showIt(); 
}); 

function showIt() {...}; 

В функции showIt, когда я хочу попробовать получить доступ $(this), он всегда возвращает window объект. Насколько мне известно, поскольку функция showIt теперь служит частью функции обратного вызова, область действия this в функции showIt должна быть такой же, как и в функции обратного вызова кнопки «», которая является нажатием на элемент. Но, похоже, это не так. Я должен использовать self.showIt.call(this)() в функции обратного вызова, чтобы получить нужный объем this. Так что происходит за сценой?

+0

'self.showIt' не имеет никакого смысла. 'showIt' не является методом' self' в коде, который вы предоставили. –

+0

@KevinB: с учетом показанного кода showIt действительно является свойством самого себя, ака глобальным. первая строка избыточна, потому что по умолчанию это окно self == this ==. это также означает, что нет смысла говорить «я». что-то, поскольку это лексическое имя области уже активировано посредством закрытия. – dandavis

+0

@ dandavis правильно, но это, очевидно, зависит от того, какова область действия. я думаю, вы можете утверждать, что, поскольку он не предоставил его, можно с уверенностью предположить, что он находится в глобальной области действия, хотя было бы бессмысленно использовать «var self = this» в глобальной области. –

ответ

3

JQuery использует callback.call(el) или эквивалентное выражение для установки значения this данному элементу DOM в функции обратного вызова. Но это не сводится к другим функциям, вызываемым внутри этого обратного вызова. Попробуйте это:

var o = { 
    name: "baz", 
    foo: function() { 
     console.log(this); 
    } 
} 

function foo() { 
    console.log(this); 
} 

function bar() { 
    console.log(this); // bar's this 
    foo();    // the global object 
    foo.call(this); // bar's this 
    o.foo();   // o 
    o.foo.call(this); // bar's this 
} 

bar.call(new Date()); 

Выход:

Thu Feb 13 2014 13:26:47 GMT-0800 (PST) 
Window {top: Window, window: Window, location: Location...} 
Thu Feb 13 2014 13:26:47 GMT-0800 (PST) VM350:10 
Object {name: "baz", foo: function} 
Thu Feb 13 2014 13:26:47 GMT-0800 (PST) 

Обратите внимание, что при вызове функции это свойство объекта, this не получает связанный с этим объектом, независимо от того, что this в контексте вызывающего , если функция не была связана ранее с использованием Function.bind.

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