Методы Javascript в отображениях глобальной области видимости - PullRequest
0 голосов
/ 22 декабря 2011

Мы используем немного JavaScript, который переписывает метод setTimeout для IE. Это связано с тем, что в некоторых версиях IE параметры передаются неправильно (см. здесь ).

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

Что происходит, когда механизм javascript анализирует файлы, у которых есть вызовы методов для методов в глобальной области видимости? Создаются ли сопоставления с методами во время анализа или при выполнении кода?

EDIT

У меня было несколько ответов на этот вопрос, которые дают другие решения этой проблемы, но проблема не в моей заботе, так как у меня уже есть решение для нее. В этом вопросе я хочу получить лучшее понимание того, как анализируется и запускается JavaScript.

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

Методы создаются при выполнении кода.

Если семантика кода верна, интерпретатор может выполнить код. При разборе ничего не было выполнено. Файл после синтаксического анализа выполняется один за другим, перед следующим анализом.

Проверьте это: У нас есть два файла js.

<script src ='1.js'></script>  
<script src ='2.js'></script>

Во втором файле мы помещаем объявление setTimeout;

 //file2
 window.setTimeout = function(){};

В первом файле мы будем проверять переопределение setTimeout

//file1
var f = function() { alert( setTimeout );  };
f();// alerts native setTimeout

 setTimeout( f, 1000 ); // We use native settimeout, propably after one second file2 being loaded and executed and function `f` will be alerts the overriden setTimeout

Если бы методы, которые я добавил, были бы созданы во время синтаксического анализа. Это будет иметь доступ к нему в любом месте скрипта, в котором он был создан, даже до его объявления. так:

//somefile.js
  setTimeout(); // we do not have access to function declared below, so while parsing  this wasn't created.
  window.setTimeout = function() { alert( 'whatever' ); }
0 голосов
/ 22 декабря 2011

Вы можете сохранить оригинальный setTimeout в глобальной переменной в начале кода, а затем перегрузить setTimeot с новой функцией.

 window.oldST = setTimeout;
 window.setTimeout = function(funct,x) {
    return oldST(funct,x);
 }

так что, если это первые строки кода js, вы перегрузите функцию setTimeout своей и установите старую в oldST.

0 голосов
/ 22 декабря 2011

РЕДАКТИРОВАТЬ # 2

Fiddle # 1 - http://jsfiddle.net/zEaL8/4/ - Позволяет установить / сбросить встроенную функцию. Чтобы увидеть, как работает переопределение и порядок вызова.

Fiddle # 2 - http://jsfiddle.net/aKnjA/1/ -Демонстрирует, что порядок определения не имеет значения. Обратите внимание, что переопределение происходит после того, как браузер анализирует вызов функции.

EDIT

Чтобы ответить на ваш вопрос: Javascript не обеспечивает какой-либо порядок определения функций. то есть мы можем вызвать функцию, определенную впоследствии в коде. Когда браузер анализирует строку кода, которая вызывает функцию, которая определена впоследствии, он не имеет никакого представления о том, где найти эту функцию. В этом случае ясно, что привязка происходит только во время выполнения, а не во время первоначального анализа. По сути, это будет означать, что ваше переопределение setTimeout будет тем, что будет выполнено. Единственное, что нужно гарантировать - это то, что переопределение самого setTimeout будет выполнено до того, как будет выполнен любой вызов.

Чтобы убедиться, что переопределение вашего нового setTimeout обрабатывается первым, вы можете поместить его в блок скрипта в качестве первого элемента внутри головного узла вне load, domReady и т. Д.

т.е. Что-то вроде:

<html>
<head>
<script>
window.setTimeout = function() {
    alert('new sT');
}
</script>
</head>
<body onload="setTimeout();"></body>
</html>
...