Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Подмена функции (https://javascript.ru/forum/misc/48840-podmena-funkcii.html)

madflash001 18.07.2014 17:27

Подмена функции
 
Добрый день.
Я пишу JavaScript для Tampermonkey (UserJS) и передо мной возникла такая проблема:
На сайте, с которым я работаю, есть функция old, которая вызывает alert, после чего исполнение скрипта, естественно, останавливается.
Выглядит это так:
function old (param) {
    // Код до алерта
    alert ('Алерт');
    // Код после алерта
}

Мне нужно подменить эту функцию на свою (в которой не будет alert'а).
Пробовал так:

function old (param) {
    // Код до алерта
    alert ('Алерт');
    // Код после алерта
}
old = function (param){
    // Код до алерта
    // Код после алерта
}

Почему то не выходит, хотя, вроде бы, и должно.
Выполняется старая функция (с алертом).

skrudjmakdak 18.07.2014 17:33

смотря где эта функция находится, может внутри какогото объекта

madflash001 18.07.2014 17:36

Функция глобальная, то есть находится просто в <script></script>.
А вызов функции происходит OnClick'ом при нажатии на кнопку (хотя это, по моему, не важно).

skrudjmakdak 18.07.2014 17:51

переопределять функцию надо ДО того как ее привяжут к событию!

<html>
	<head>
		<title>example</title>
		<style>
		.big_container
		{
		width: 300px;
		height: 300px;
		border: 1px solid black;
		}
		</style>
	</head>
	<body>
		<div class="big_container"></div>
		<script>
function one ()
	{
	console.log(1);
	}		

document.querySelector('.big_container').onclick = one;

one = function ()
	{
	console.log(2);
	}
		</script>
	</body>
</html>

Erolast 18.07.2014 18:02

Либо переопределять просто созданием функции с таким же именем.
<html>
  <head>
    <title>example</title>
    <style>
    .big_container
    {
      width: 300px;
      height: 300px;
      border: 1px solid black;
    }
    </style>
  </head>
  <body>
    <div class="big_container"></div>
    <script>
    function one()
    {
    console.log(1);
    }

    document.querySelector('.big_container').onclick = one;

    function one()
    {
      console.log(2);
    }
    </script>
  </body>
</html>

Дело в том, что интерпретатор сначала считывает всю область видимости, определяет именнованные функции, и только потом начинает выполнение кода.

madflash001 18.07.2014 18:03

При запуске вашего примера в консоль, почему то выводится весь его код, но смысл я понял. Большое спасибо за помощь.

Sweet 18.07.2014 19:33

Цитата:

Сообщение от Erolast
Либо переопределять просто созданием функции с таким же именем.

Ага, но только в рамках одного скрипта, который ТС менять не будет. А так это не сработает:
<style>
    .big_container
    {
      width: 300px;
      height: 300px;
      border: 1px solid black;
    }
</style>
<div class="big_container"></div>
<script>
function one() {
  alert(1);
}
 
document.querySelector('.big_container').onclick = one;
</script>
<script>
// что за мудацкий стиль оформления кода??? 
function one()
{
console.log(2);
}
</script>

MallSerg 18.07.2014 19:41

Цитата:

Сообщение от madflash001
Функция глобальная, то есть находится просто в <script></script>.
А вызов функции происходит OnClick'ом при нажатии на кнопку (хотя это, по моему, не важно).

Это очень важно
В JavaScript операция (присваивания "=") присваивает переменным ссылку на объект для объектов для примитивных типов копирует по значению
т.е. на пальцах
объект.onclick = old //приведет к тому что в onclick будут хранится ссылка на функцию
если после этого глобальному свойству "old" присвоить любое значение то это ни как не повлияет на функцию на которую раньше указывало свойство "old" а в onclick хранится именно ссылка

newobject 18.07.2014 21:50

MallSerg,
Ты щечки то немного сдуй. Ты ни хера не понимаешь, что происходит.
Цитата:

Сообщение от MallSerg
приведет к тому что в onclick будут хранится ссылка на функцию

Не В онклик, а сам онклик - это и есть ссылка на функцию.
В этом контексте, нет никакой разницы, в каком объекте ты определил что-либо. в одном случае это будет global.old в другом -- object.old никакой разницы нет. Спорить я не буду, сразу говорю -- ты баран.

skrudjmakdak 18.07.2014 22:26

Цитата:

Сообщение от newobject (Сообщение 321736)
ты баран.

а хамить не красиво, если он даже действительно не прав. нужно по-человечески объяснять


Часовой пояс GMT +3, время: 20:29.