2015-08-08 5 views
5

Рассмотрим простой пример:Почему JSLint запрещает «это» ключевое слово?

"use strict"; 
var Foo = { 
    field: 0, 
    func: function() { 
     this.field = 4; 
    } 
} 

JSLint бросает ошибку:

Unexpected 'this'. At the line "this.field = 4".

Я, кажется, некоторые вопросы здесь, в StackOverflow просят это, и во всех случаях ответ был просто включите флаг «Поверните этот». Тем не менее, меня интересует, почему создатели JSLint считают, что использование «этого» (или может привести) к ошибке.

Кроме того, как бы реализовать функции-члены без «этого» ключевого слова и не ожидая, что пользователь передаст экземпляр в качестве первого аргумента?

EDIT Может быть, я не заставляю себя достаточно ясно, что этот вопрос, несмотря на глядя похоже не имеет ответа на то, что я спрашиваю: JSLint Error: Unexpected 'this'

Проблема с этим вопросом не вопрос, а ответы, которые он получил. Обратите внимание, как принятый ответ: «Мое предложение: скажите JSLint, чтобы он заткнулся». И я специально говорю в своем сообщении, что это недействительный ответ на меня, поскольку я хочу понять, почему использование этого запрещено JSLint, а не как избежать этой ошибки.

+0

Только примечание, JSLint не только запрещает вещи, которые могут привести к ошибкам. Он «заставляет» использовать конкретный стиль кодирования. – meskobalazs

+2

Я хотел бы отметить, что я особенно упоминаю в своем вопросе, что он отличается от того, который я «дублирую», несмотря на то, что не упоминал ссылку. В частности, когда я сказал: «У меня есть некоторые вопросы здесь, в StackOverflow, просящие об этом, и во всех случаях ответ заключался только в том, чтобы включить флаг« Tolerate this ». Я имел в виду этот самый вопрос, среди прочего.Обратите внимание, что принятый ответ в этом вопросе неприемлем с моей точки зрения, поскольку отключение ошибки не объясняет, что вызвало ее и почему было вызвано. – Setzer22

+0

@meskobalazs, Полезно знать. Тем не менее, я заинтригован тем, что такое «хороший» стиль кодирования, который позволяет избежать «этого» и почему это, по-видимому, правильное использование «этого» ключевого слова, искаженного в соответствии с JSLint. – Setzer22

ответ

2

Как @pdenes отметил в комментариях, была некоторая дискуссия на тему здесь: https://plus.google.com/communities/104441363299760713736/s/Berriman%20new%20version%20fails

Там также Douglas Crockford youtube talk called "The Better Parts", в котором Дуглас обнажает некоторые из его мнений по этому вопросу, и предлагает (по его мнению,) лучший способ сделать конструктор.

Предлагаемый шаблон конструктор выглядит следующим образом (непосредственно взятый из его разговора, он также иллюстрирует некоторые особенности ES6):

function constructor(specs) { 
    let {member} = spec, 
     {other} = other_constructor(spec), 
     method = function() { 

     }; 
    return Object.freeze({ 
     method, 
     other 
    }); 
} 

«Растр», как я понимаю, чтобы избежать использования «этого »и любой другой способ создания объекта (посредством нового или Object.create), также избавляясь от прототипного наследования.

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

Все «объектно-ориентированные» вещи достигаются путем хранения элементов и методов в закрытии конструктора, а функция-член может ссылаться на их по имени, потому что они присутствуют в текущей области. Это успешно избегает использования «этого».

К сожалению, реальный ответ, который я получаю от этого, состоит в том, что существует множество запутанных способов создания объекта в javascript, а у ИМО есть свои недостатки. JSLint - отличный инструмент, но никто не должен следить за ним, не делая каких-либо исследований и понимая, почему эти ошибки даны. Особенно, когда нет реальной, всеобъемлющей причины. Даже не автор.

+0

Это хороший ответ. Конечно, справедливо принять ваш собственный ответ здесь, чтобы мы могли перечеркнуть его из оставшегося без ответа пула JSLint. На самом деле лучше удалить этот обман и опубликовать свой ответ по другому вопросу. Я не видел этого видео, когда [я ответил там] (http://stackoverflow.com/a/30375300/1028230). Ваш ответ был бы полезен. Я понимаю дельта между «избеганием» и «пониманием», которую вы делаете, но полезно помочь всем понять, кого иначе можно было бы избежать. (Лично я не понимаю, как любой ответ JSLint может быть «не использовать JSLint», и это происходит слишком часто.) – ruffin

Смежные вопросы