Почему мы использовали ключевое слово «this» в этом фрагменте?

#javascript #oop #object #this #code-snippets

#javascript #ооп #объект #это #фрагменты кода

Вопрос:

     var someObject = {
someArray : new Array(),

someInt : 0,

Total: function(){

this.someInt = 0;//we used "this" keyword here, why?Cant we just say "someInt = 0"?

for(var i=0;i<this.someArray.length;i  ){//and here..

var c = this.someArray[i];//again we use "this"

this.someInt  = c.value;//also here
}
  

итак, почему мы использовали ключевое слово «this»? мы не можем просто ввести имя переменной?

Комментарии:

1. someInt был объявлен ранее, но да, someInt, вероятно, можно было бы использовать как /var (также, указав, что this.someInt не имеет никакого эффекта в этом конкретном фрагменте, поэтому его можно удалить полностью)

Ответ №1:

this Ключевое слово относится к объекту, от имени которого вызов выполняется позже, т.Е. Если вы вызываете функцию следующим образом:

 someObject.Total()
  

затем this будет ссылаться на someObject внутри функции. Благодаря this ключевому слову функция может изменять someInt и считывать, из someArray которых являются членами someObject . Если вы удалились this из тела функции, все эти ссылки будут относиться к глобальным переменным или переменным, локальным для тела функции.

Ответ №2:

Нет, оператор someInt = 0 не изменит someInt свойство someObject . Вместо этого он изменит свойство, указанное someInt в глобальном объекте / объекте по умолчанию ( window в браузере), которое, очевидно, не нужно вам.

Обратите внимание, что (в зависимости от того, как вы собираетесь вызывать Total функцию) вы также можете записать это как someObject.someInt . Однако при вызове функции, подобной этой:

 someObject.Total()
  

…значение this в функции равно someObject .

Ответ №3:

Нет, потому что переменная создана не полностью. Используя ключевое слово «this», вы можете получить доступ к переменной из нее самой.

Ответ №4:

Мне кажется, что это просто для ясности. Вероятно, всегда использовать this. — это хорошая практика, когда вы не используете специальные соглашения об именовании, например, для переменных или локальных переменных (в других языках, а не только в javascript).

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

Комментарии:

1. Чтобы ответить на другой вопрос: нет, мы не можем «просто ввести имя переменной», потому что тогда переменная будет определена не как свойство someObject , а как локальная (если используется var ) или глобальная переменная.

2. Верно, это не «просто для ясности».

3. Да, я говорил слишком рано — this в этом случае требуется — я думаю на C # / Java, где что-то подобное было бы скорее предпочтением / удобочитаемостью.

4. Не стесняйтесь отклонять мой ответ — теперь я чувствую себя виноватым за то, что понял это неправильно и получил положительные отзывы.

Ответ №5:

Фактически, Дуглас Крокфорд в своем Javascript The Good Parts предлагает не использовать это ключевое слово в коде, поскольку функции из объекта могут быть применены к другим объектам, и это может привести к ошибкам. поэтому иногда лучше использовать только имена переменных.

Комментарии:

1. не лучше ли просто использовать имена переменных. Дуглас Крокфорд говорит, что нужно присвоить «this» «that» и использовать «that» вместо «this». Таким образом, когда метод вызывается из контекста другого объекта, «это» будет ссылаться на исходный контекст, а не на вызывающий. Я надеюсь, что это имеет смысл

Ответ №6:

someInt определяется как свойство someObject . Его нужно было бы определить как переменную, чтобы получить к нему доступ таким образом.

http://jsfiddle.net/Z7mSK/

Ответ №7: