2015-06-21 5 views
-1

В чем преимущество использования obj.loc++ вместо this.loc++ в четвертой строке?Разница между этими двумя линиями?

var carlike = function(obj, loc) { 
    obj.loc = loc; 
    obj.move = function() { 
     this.loc++; 
    }; 
    return obj; 
}; 

var amy = carlike({}, 1); 
amy.move(); 

Это было немного объяснено на этом видео, но разница между этими двумя до сих пор не ясна для меня. https://www.youtube.com/watch?v=9oi0NY8Pen8

В этом видео говорится, что когда мы используем this.loc++, он привязывается к новому значению, каждый раз, когда вызывается move. Но когда мы используем obj.loc++, то каждый раз, когда мы вызываем функцию автомобиля carlike, создается новая область закрытия, поэтому переменная obj всегда будет ссылаться только на один объект автомобиля. Что это значит?

+0

FYA - Является ли что-либо ответом на ваш вопрос или если у вас есть свой собственный ответ, то, пожалуйста, разместите его, чтобы другие могли воспользоваться им. – hagrawal

ответ

2

Если вы используете this, вы установите его значение при вызове его:

amy.move();   // Called with this === amy 
amy.move.call(foo); // Called with this === foo 

Если вы используете obj, он всегда будет obj, независимо от того, как move называется.

0

Это видео с курса Udacity Object Oriented JavaScript. Некоторые уроки перед преподавателем рассказывают о ключевом слове this.

this относится к объекту/вызывающей функции/методу. Обычно это object, который остается от dot. (В ответе @Oriol this в качестве параметра записывается специальная функция call.)

И это действительно разница, @Oriol прав.

0

Во-первых, вы правильно поняли, что нет никакой разницы в результате использования this.loc или obj.loc.

Короткий ответ на ваш вопрос: нет прямых прямых преимуществ или преимуществ использования obj.loc++ вместо this.loc++.

Пояснение: Имеется 2 важных контекста, в которых вы должны понимать this.

  1. Глобальный контекст: в контексте глобального исполнения (вне любой функции) это относится к глобальному объекту, будь то в строгом режиме или нет. Поскольку это не ваш случай, так что давайте не будем копать.
  2. Контекст функции: внутри функции значение этого зависит от того, как вызывается функция. В нестрогий режим, значение этого всегда должно быть объектом, поэтому он по умолчанию относится к глобальному объекту. В строгом режиме значение этого параметра остается в том, что было установлено при вводе контекста выполнения. Если он не определен, он остается неопределенным. Он также может быть установлен на любое значение, например null или 42, или «Я не это».

Прочитано this from MDN для более подробного объяснения.

Теперь, в вашем случае, управляете ли вы в строгом режиме или нестрогого режима, будете ли вы использовать this или obj вы увидите те же результаты, потому что, когда вы используете this затем снова становится ваш контекст функции и доступ loc на this.

Теперь, говоря о конвенции, предположим, что существует еще одна глобальная переменная с именем loc и при использовании this.loc++; внутри carlike функции, то все равно this будет работать в контексте функции и приращение loc из carlike функции, но есть плохая читаемость, AT- для новичков, что он будет увеличивать глобальный loc или местный loc.

Итак, подведение итогов с использованием obj.loc++; - лучшая идея.