К чему относится ключевое слово this в следующем коде Javascript?

Это пример из JavaScript: Полное руководство Дэвида Фланагана.

//Replace the method named m of the object o with a version that logs messages before and after invoking the original method.

function trace(o, m) {
  var original = o[m];                            // Remember original method in the closure.
  o[m] = function() {                             // Now define the new method.
    console.log(new Date(), "Entering:", m);      // Log message.
    var result = original.apply(this, arguments); // Invoke original.
    console.log(new Date(), "Exiting:", m);       // Log message.
    return result;                                // Return result.
  };
}

Я понимаю, что, поскольку m является методом o, «это» должно относиться к объекту o. Но я не могу понять как; потому что в функции "это" должно ссылаться на глобальный объект (нестрогий режим).
Кроме того, как массив "аргументов" содержит аргументы исходной функции, а не аргументы анонимной функции-оболочки?


person Abhimanyu Pathania    schedule 15.11.2014    source источник
comment
Невозможно сказать. Значение this зависит от того, как вызывается функция, и вы не показываете нам, как вы вызываете o[m]. Утверждение в функции 'this' должно ссылаться на глобальный объект (нестрогий режим) верно только иногда (поскольку значение зависит от того, как оно вызывается, и оно может вызываться или не вызываться в контексте глобального объекта).   -  person Quentin    schedule 15.11.2014
comment
@Квентин Да, ты прав. Я понял это после прочтения этого ответа. Я думаю, что автор намеревается вызвать функцию «m» как метод объекта «o» в глобальном контексте.   -  person Abhimanyu Pathania    schedule 15.11.2014
comment
@Quentin: Это вовсе не невозможно, поскольку значение this на самом деле не имеет значения. Он просто передается исходному методу, так что он будет вызываться в том же контексте, что и функция-оболочка.   -  person Guffa    schedule 19.11.2014


Ответы (1)


Функция trace заменит метод в объекте оболочкой, которая выведет некоторые сообщения журнала и вызовет исходный метод.

Анонимная функция — это оболочка, которая будет вызываться вместо исходного метода. Когда он вызывается, он вызывается как метод объекта, поэтому this будет ссылаться на объект.

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

Массив arguments — это аргументы функции-оболочки, так что это будут аргументы, предназначенные для исходного метода. Вот почему они передаются при вызове исходного метода.

Если у вас есть такой объект:

var html = {
  bold: function(x) {
    return "<strong>" + x + "</strong>";
  }
};

Если вы теперь используете функцию trace:

trace(html, 'bold');

Теперь объект html будет содержать эквивалент:

{
  bold: function() {
    var m = 'bold';
    var original = function(x) {
      return "<strong>" + x + "</strong>";
    };
    console.log(new Date(), "Entering:", m);
    var result = original.apply(this, arguments);
    console.log(new Date(), "Exiting:", m);
    return result;
  }
}
person Guffa    schedule 15.11.2014
comment
Почему минус? Если вы не объясните, что именно вы считаете неправильным, это не улучшит ответ. - person Guffa; 19.11.2014