Javascript - использовать локальный var или это? - PullRequest
2 голосов
/ 20 декабря 2011

Я работаю с методами-прототипами, и вот сценарий

function Foo () {
    this.x = 5;
    this.y = 2;
    this.z = this.addValues();
}
Foo.prototype = {
    addValues:  function (){
        return this.x + this.y; 
    }
}

Очевидно, это всего лишь простой пример;в реальном проекте будет много действий в функции addValue.Можно ли использовать ключевое слово this несколько раз или кэширование в локальную переменную помогает улучшить производительность.Например, ниже будет иметь значение?

Foo.prototype = {
    addValues:  function (){
        var self = this;
        return self.x + self.y; 
    }
}

Ответы [ 3 ]

5 голосов
/ 20 декабря 2011

Вероятно, нет существенной разницы между self.x и this.x.Что может изменить, так это

  var x = this.x, y = this.y;

  // massive amounts of computation involving x and y

Такие микрооптимизации, вероятно, не стоят того, если вы действительно не участвуете в какой-то передовой разработке игр или чем-то еще.Сначала доведите свои алгоритмы и структуры данных до нюхательного табака, а затем переживайте о таких вещах, как это в прошлом.Вы никогда не знаете, когда разработчики систем времени выполнения JavaScript представят новые оптимизации.Они не могут исправить ваши плохие алгоритмы, но могут существенно повлиять на микрооптимизацию.

2 голосов
/ 20 декабря 2011

this - это стандартный способ доступа к x и y.Вы не получите никаких улучшений от кеширования this в локальную переменную - если что, вы теряете пространство, сначала объявив self.

Единственный возможный рисквы бы увидели что-то вроде этого:

var f = new foo();
var stupid = f.addValues;
stupid(); // whoops - this is suddenly the global object, 
          // and your method is broken.

Сказав это, я не думаю, что вы несете ответственность за людей, злоупотребляющих вашей функцией, и я бы не волновался об этом.

Кроме того, условно, функции, предназначенные для использования в качестве конструкторов, должны начинаться с заглавной буквы.Рассмотрим переименование foo в Foo

0 голосов
/ 20 декабря 2011

В этом примере назначение this на self не должно иметь никакого значения. JavaScript назначает объекты не по значению, а по ссылке, а это означает, что self и this оба указывают на один и тот же объект. Делая это, вы ничего не получаете.

foo.prototype = {
    addValue:  function (){
       // self and this point to the same object! 
       var self = this;
        return self.x + self.y; 
    }
}
...