Хром и JavaScript

Я использую функцию Javascript с именем top на всех страницах, чтобы установить стандартизированный заголовок (почти на 2000 подстраниц). Но это не работает в Chrome. Он утверждает (в консоли), что

  1. top уже определен (где я пытаюсь определить функцию с двумя параметрами)
  2. это свойство "верх" объекта [object Windows] это не функция (где я ее использую)

поэтому кажется, что Chrome не различает свойство объекта без параметров и пользовательскую функцию с двумя параметрами

Это принято в IE, Firefox, Opera, Safari

4 ответа

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

Самым простым и чистым было бы просто переименовать вашу собственность.

Вот список слов, которые вы должны избегать:

Зарезервированные слова
Классы и Объекты
Глобальные свойства и методы

Если вы введете:

Object.getOwnPropertyDescriptor(window.top).writable;

в консоли веб-разработчика Chrome вы увидите, что window.top не доступно для записи, по крайней мере, в Chrome это не так. И этого не должно быть - просто используйте другое имя или поместите его в собственное пространство имен.

Попробуйте создать новый контекст для вашего приложения /javascript, чтобы он не сталкивался

(function(realTop,realWindow) {
   function top() {
      // do something
   }

   // calls our top function
   top();

   realTop.
})(top, window);

где realTop - это ссылка на исходный верхний объект, а realWindow - это ссылка на исходный оконный объект в указанном контексте.

но, по моему мнению, старайтесь избегать таких имен в будущем

Вы должны переименовать функцию во что-то менее распространенное, например, "topHeader" или "theHeader" или что-то в этом роде. простые имена, такие как "top", наверняка встречаются очень часто.

практическое правило: вы должны сделать свои переменные и функции настолько уникальными, насколько это возможно, чтобы уменьшить вероятность конфликтов имен.

Вы также можете уменьшить вероятность конфликта имен, используя литералы объектов:

var myApp = {
     top:function(){
       //excite some code...
   },
      someOtherProp:function(){}
}

myApp.top();
Другие вопросы по тегам