Речь идет не о производительности, а о доступе к свойству определенного экземпляра объекта: -
x.init()
Не будет отображаться «тест», если вы не использовали this
в функции.
По сути, вышеуказанная строка такая же, как: -
x.init.call(x);
первый параметр в использовании call
присваивается this
при выполнении функции.
Теперь рассмотрим: -
var fn = x.init; //Note no () so the function itself is assigned to the variable fn
fn();
Теперь вы ничего не получаете в оповещении. Это потому, что вышеприведенное эффективно: -
fn.call(window);
В Javascript, размещенном в браузере, объект window
является синонимом глобального объекта. Когда функция вызывается «в необработанном виде», this
по умолчанию принимает глобальный объект.
Классическая ошибка делает что-то вроде этого: -
var x = {
ele: 'test';
init: function(elem) {
elem.onclick = function() { alert(this.ele); }
}
}
x.init(document.getElementById('myButton'));
Однако это не работает, потому что функция, прикрепленная к событию onclick, вызывается браузером с использованием кода, подобного следующему: -
onclick.call(theDOMElement)
Следовательно, когда функция запущена, this
не то, что вы думаете.
Мое обычное решение этой ситуации: -
var x = {
ele: 'test';
init: function(elem) {
var self = this;
elem.onclick = function() { alert(self.ele); }
elem = null;
}
}
x.init(document.getElementById('myButton'));
Обратите внимание, что elem = null
- это обходной путь утечки памяти в IE.