2013-02-13 3 views
1

Я новичок в JS, и читал много о поведении причуды изменения содержимого this, поэтому я сделал простой пример:Простого этот контекст Пример изменения в Javascript

HTML

<button>button1</button> 

JavaScript

var button1, getText 

button1 = document.getElementsByTagName('button')[0] 

getText = function(){alert(this.textContent)} 

button1.addEventListener('click', getText) 

http://jsfiddle.net/e95ME/

Но я не вижу контекста this изменен, так как код работает. Любой может изменить этот код или дать еще один простой пример, чтобы показать поведение quirk изменения содержимого this?

+0

Это не причуда, это фундаментальная особенность. –

+1

Если вы новичок в JS, пожалуйста, найдите хорошую привычку заканчивать заявления точками с запятой. –

+0

@AtesGoral Или просто последовательно писать в безопасном стиле без запятой; приведенный выше фрагмент недостаточно, чтобы сказать, что такие методы кодирования используются (или не используются), но вы, вероятно, правы для «новичка», хотя я оспариваю окончательное утверждение. – 2013-02-13 03:04:52

ответ

0

Когда кнопка нажата, прослушиватель событий установит this самому элементу DOM.

Это как если ваша функция вызывается так:

getText.call(<button-element>, <event>) 
+0

Спасибо, вы действительно отвечаете, что я даже не могу поставить в слово – mko

+0

@yozloy Рад помочь :) –

2
var button1, getText 

button1 = document.getElementsByTagName('button')[0] 

getText = function(){alert(this.textContent)} // called in context of `button1` 

button1.addEventListener('click', getText) 

getText(); // called in context of `window` 

Когда окно нагрузки, он будет говорить undefined, потому что нет никакой собственности window.textContent. Когда вы нажимаете кнопку, она должна указывать button1, потому что она вызывается в контексте кнопки.

+0

Хороший пример, кажется, что функция addEventListener передает контекст текущего узла функции обратного вызова – mko

1

ли вы имеете в виду это?

var button1, getText 

button1 = document.getElementsByTagName('button')[0] 

getText = function() { 
    this.textContent = "changed content"; 
} 

button1.addEventListener('click', getText) 
+0

Да, ваш ответ - это то, что я ищу – mko