2013-12-06 2 views
7

Я хотел бы знать, в чем разница междуВ чем разница между window.setTimeout() и setTimeout()?

window.setTimeout(myFancyFunciton, 1000); 

и

setTimeout(myFancyFunciton, 1000); 

И, кажется, сделать то же самое. Когда вы должны использовать тот или иной?

+0

Первый будет работать только в браузере, последний - в любом месте. – zerkms

+0

Если в браузере нет разницы, поскольку объект окна существует. В других средах может не существовать. – guanabara

+0

А где еще можно работать, кроме браузера? – user3073240

ответ

4

Предполагая, что мы говорим о браузере на основе JavaScript: никакой разницы. setTimeout() просто опускает window., который является подразумевается. Эффект, который у них есть, точно такой же.

Это выбор стиля и предпочтений кодирования.

Для JavaScript, который не запускается в браузере, объект window не определен, поэтому window.setTimeout() не будет работать. setTimeout() однако, будет работать.

+3

'setTimeout()' не входит в спецификацию ECMAScript , поэтому это зависит от глобального глобального объекта, будет ли он работать или нет. – Oswald

20

JavaScript работает в среде, которая определяется с помощью глобального объекта. Методы глобального объекта можно вызывать без явного обращения к объекту (т. Е. Без нотации obj.function()).

При запуске JavaScript внутри браузера глобальный объект предоставляется объектной моделью документа (DOM). Глобальный объект DOM имеет метод setTimeout(). Вот почему вы можете позвонить setTimeout().

DOM указывает, что глобальный объект имеет свойство с именем window, которое является ссылкой на глобальный объект. Вот почему вы можете позвонить window.setTimeout() и (по транзитивности) window.window.setTimeout(), window.window.window.setTimeout(), и (как вы угадали) window.window.window.window.window.window.window.window.window.setTimeout(). Это один и тот же метод одного и того же объекта.

2

От https://developer.mozilla.org/en-US/docs/Web/API/Window

Объект окна представляет собой само окно.

Таким образом, все переменные и функции, которые вы вызываете, заключены внутри окна объекта. Однако вы можете опустить ссылку на объект каждый раз, когда вы вызываете функцию или переменную.

Зачем это? Подумайте о странице с 2 или более кадрами. Каждый кадр имеет собственный window. Вы можете получить доступ к переменной внутри фрейма из другого фрейма, просто обращаясь к объекту цели window. Это допустимо для каждой переменной или функции, объявленной как глобальная ... и она также подходит для собственных функций, например setTimeout.

Так почему же нам нужно писать объяснение window.setTimeout?

Просто, если вы находитесь внутри области действия и используете одно и то же имя собственной функции, вы можете выбрать, какую функцию использовать.

, например:

function myF() { 
    function setTimeout(callback,seconds) { 
    // call the native setTimeout function 
    return window.setTimeout(callback,seconds*1000); 
    } 
    // call your own setTimeout function (with seconds instead of milliseconds) 
    setTimeout(function() {console.log("hi"); },3); 

} 
myF(); 

Пожалуйста, обратите внимание, что объект window существует только в среде браузера. Глобальным объектом Node.js является global, где window не определен.

0

У меня возникла проблема, связанная с этой темой. Я попытался сделать некоторые функции моего SPA, чтобы быть частью процесса рендеринга на стороне сервера. Я использовал setTimeout для предоставления некоторых отложенных действий в пользовательском интерфейсе. Когда он работает на стороне сервера (NodeJS), он переходит на отложенное действие на стороне сервера без отношения к стороне клиента. Это из-за браузера setTimeout (скажем window.setTimeout) не совпадает с NodeJS setTimeout. Помимо различных сред исполнения, которые запрещают использование одного setTimeout как для рендеринга на стороне клиента, так и на стороне сервера, реализации Browser и NodeJssetTimeout отличаются друг от друга, они имеют различное возвращаемое значение ... Теперь я ищу некоторое обходное решение.

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