Функции в make-файле

Object(window) никогда не будет клонировать window, но new Object(window) может. Все текущие - потенциально все известные - реализации просто возвращают одну и ту же ссылку, хотя спецификация допускает поведение, определяемое реализацией.

Шаги для 15.2.1.1 говорят:

  1. Если значение равно null, неопределенному или не предоставленному, создайте и верните новый объект Object точно так же, как если бы был вызван стандартный встроенный конструктор Object с теми же аргументами
  2. Return ToObject (значение) .
blockquote>

В определении ToObject (9.9) перечислены несколько типов, которые будут пойманы на шаге 1 (в таблице 14), но для Object имеется очень простое определение:

Результат - входной аргумент (без преобразования).

blockquote>

В нем явно указано, что входной аргумент будет возвращен как есть, поэтому они должны быть равными ссылками (===).

Определение для new Object (15.2.2.1) имеет аналогичную цепочку проверок типов на шаге 1, но шаг для объектов (1.a ):

i. Если значение является родным объектом ECMAScript, не создавайте новый объект, а просто возвращайте значение.

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

blockquote>

То есть для любого объекта-хоста foo, то вызов Object(foo) должен === foo, но new Object(foo) может === foo.

Объекты хоста определены в 4.3.8 как

в среде хоста для завершения среды выполнения ECMAScript.

blockquote>

В этом ответе перечислены несколько объектов-хостов, которые включают в себя window, history и т. д. Запуск те, которые через new Object(foo) должны (но не должны) возвращать другой объект.

В любом случае передача , но объекта хоста, new Object(foo) представляется более сложной цепью, которая отклоняется на ToObject почти так же, как Object(foo).

К сожалению, в 15.2.2.1.1.a.ii указано, что результат возвращается в зависимости от реализации »и не имеет каких-либо особенностей в отношении« действий [которые] приняты », и похоже, что Chrome вернет то же самое bject (равные ссылки) для всех перечисленных «объектов хоста».

Использование этого скрипта для проверки:

var objects = [
  /* Native objects */
  'Object', 'Date', 'Math', 'parseInt', 'eval',
  /* Host objects */
  'window', 'document', 'location', 'history', 'XMLHttpRequest', 'setTimeout'
];

function getDefinedReference(name) {
  if (eval('typeof ' + name) !== 'undefined') {
    return eval(name);
  } else {
    throw new Error('' + name + ' is not defined.');
  }
}

function checkIdentity(name) {
  try {
    var ref = getDefinedReference(name);
    var no = new Object(ref);
    var o = Object(ref);

    console.log(name, ref === no, ref === o, no === o);

    if (ref === o && no !== o) {
      // Make sure ref === Object(ref) but not new Object(ref)
      console.log(name, 'returns different references.');
    }
  } catch (e) {
    console.warn(e);
  }
}

objects.forEach(checkIdentity);

if (typeof window !== 'undefined') {
  for (var f in window) {
    checkIdentity(f);
  }
}

не находит объектов, где Object и new Object ведут себя по-разному. @ Xotic750 кажется правильным, что он может быть зависимым от реализации, но никто его не использует.

48
задан Rob Wells 3 February 2009 в 16:18
поделиться

1 ответ

Вы ищете call функция .

compile =                                                 \
        if [ $(UNAME) = $(1) ]; then                      \
          $(MAKE) FC=$(2) FFLAGS=$(3) PETSC_FFLAGS="..."  \
                  TARGET=$@ LEXT="$(4)_$(UNAME)" -e syst; \
        else                                              \
          echo $(err_arch);                               \
          exit 1;                                         \
        fi

debug_ifort_Linux:
        $(call compile,Linux,ifort,$(difort),ifort)

, Если можно реструктурировать Ваш Makefile немного, тем не менее, необходимо видеть, можно ли использовать make условные выражения вместо sh.

38
ответ дан ephemient 7 November 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: