Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (112)

Наибольший вклад в теги

Все теги (41)

Лучшие ответы пользователя

Все ответы (681)
  • Что можно считать глубокими знаниями в js?

    @MaxKorz
    Глубокое знание/понимание JS:
    - понимание как работает браузер;
    - как работает V8;
    - какой код будет оптимизирован движком, а какой нет и почему;
    - умение находить утечки памяти и знать что их вызывает;
    - умение пользоваться профайлером;

    Ну и сам JS: понимание прототипного наследования, замыканий, области видимости, this, promise, call, apply, bind, регулярки и т.п.

    Как работает браузер
    Под капотом V8
    Что убивает оптимизацию V8 (еще)
    Написание быстрого JS кода, еще и еще
    4 вида утечек памяти в JavaScript и как с ними бороться (перевод)

    Бонус - как работает интерпретатор javascript

    P.S. очевидно, что достичь глубоких познаний в JS будет сложновато без хотя бы средних познаний в английском
    Ответ написан
  • Есть сервис для того, чтобы научиться бегло понимать английскую речь?

    @MaxKorz
    Если мало времени (5-30 минут практики в день) - заходите на любой сервис с видео или музыкой и смотрите популярные видео на английском. Субтитры к видео прилагаются не всегда, в отличии от музыки (текст песни), но просто слушать речь (привыкая к ней) тоже полезно.
    youtube.com
    oplayer.org

    Рекомендую следующие каналы на youtube:
    По обучению английскому:
    www.youtube.com/user/krutopridumal
    www.youtube.com/user/duncaninchina
    Развлекательные:
    www.youtube.com/user/RayWilliamJohnson
    www.youtube.com/user/RunawayPlanet
    www.youtube.com/user/DeStorm
    www.youtube.com/user/TheFineBros
    www.youtube.com/user/sxephil
    Научные:
    www.youtube.com/user/Vsauce
    www.youtube.com/user/Vsauce2
    www.youtube.com/user/Vsauce3
    www.youtube.com/user/minutephysics

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

    Если времени много - скачиваете с thepiratebay.org или с рутрекера (и т.д.) любимый фильм или сериал в оригинале, а затем на notabenoid.com или www.opensubtitles.org/en/search ищите субтитры. И смотрите.

    Чем больше практики, тем будет легче.

    Если много времени и денег, то еще более лучший способ - нанять репетитора. Только не студентку филологического, а "натив спикера" - иностранца, приехавшего работать в Россию.
    Ответ написан
  • Где используются прототипы, наследование в JS приложениях?

    @MaxKorz
    Вы наверное шутите. Вы всегда используете prototype, когда используете классы
    class Car {
      constructor() {
        this.isRunning = false;
        this.engine = 'V8';
      }
      
      start() {
        this.isRunning = true;
      }
    }
    это синтаксический сахар над
    var Car = (function () {
        function Car() {
            this.isRunning = false;
            this.engine = 'V8';
        }
        Car.prototype.start = function () {
            this.isRunning = true;
        };
        return Car;
    }());


    bind нужен для передачи контекста. Самый банальный пример - стрелочные функции:
    this.setState({ loading: true });
    
    fetch('/').then(() => {
      this.setState({ loading: false });
    });
    это тоже самое, что
    this.setState({ loading: true });
    
    fetch('/').then(function() {
      this.setState({ loading: false });
    }.bind(this));

    пример из реального мира: https://jsfiddle.net/6L2wetcg/ при клике на кнопку alert выведет undefined, т.к. контекст вызова функции при клике отличается от того, в котором задается обработчик.
    Решение - использовать bind: https://jsfiddle.net/7u7qe61b/

    А как вы без наследования "два года" с angularJS приложениями работаете я не знаю.

    Банальный HttpService проверяющий авторизацию при запросах
    import {Injectable} from '@angular/core';
    import {Http, XHRBackend, RequestOptions, Request, RequestOptionsArgs, Response, Headers} from '@angular/http';
    import {Observable} from 'rxjs/Observable';
    import 'rxjs/add/operator/map';
    import 'rxjs/add/operator/catch';
    
    @Injectable()
    export class HttpService extends Http {
    
      constructor (backend: XHRBackend, options: RequestOptions) {
        let token = localStorage.getItem('auth_token'); // your custom token getter function here
        options.headers.set('Authorization', `Bearer ${token}`);
        super(backend, options);
      }
    
      request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> {
        let token = localStorage.getItem('auth_token');
        if (typeof url === 'string') { // meaning we have to add the token to the options, not in url
          if (!options) {
            // let's make option object
            options = {headers: new Headers()};
          }
          options.headers.set('Authorization', `Bearer ${token}`);
        } else {
        // we have to add the token to the url object
          url.headers.set('Authorization', `Bearer ${token}`);
        }
        return super.request(url, options).catch(this.catchAuthError(this));
      }
    
      private catchAuthError (self: HttpService) {
        // we have to pass HttpService's own instance here as `self`
        return (res: Response) => {
          console.log(res);
          if (res.status === 401 || res.status === 403) {
            // if not authenticated
            console.log(res);
          }
          return Observable.throw(res);
        };
      }
    }

    Тем более, что весь react построен на наследовании от React.Component:
    export default class ComponentName extends React.Component


    Нужно коллекцию DOM элементов сделать массивом? Используем call
    var nodesArray = [].slice.call(document.querySelectorAll("div"));
    так же call используется для реализации наследования в es5 совместимом коде

    Нужно элегантно применить функцию к массиву? Используем apply
    var numbers = [1, 2, 3, 4];
    Math.max.apply(null, numbers) // 4
    Math.min.apply(null, numbers) // 1


    все эти вещи нужно знать не "для собеседования", а как раз чтобы продвинуться в профессиональном плане
    Ответ написан
  • Верстать без фреймвороков это значит быть не професионалом?

    @MaxKorz
    Скорее всего правильно отшил.
    Заказчик платит за результат в короткий срок, а не за удовольствие программиста от кодерства.

    С нуля можно писать свои пет-проекты. При работе с заказчиками лучше использовать фреймворки, т.к:
    - Они проверены временем и сообществом (минимум багов)
    - Большое количество готовых плагинов (быстрое внедрение фич)
    - Новый разработчик легко войдет в разработку (уменьшение затрат на обучение и переписывание)
    - Быстрая разработка (нет необходимости кодить все подряд, а затем фиксить баги)

    У меня был коллега, который все писал с нуля. Не только CSS фреймворки, но и JS плагины. В итоге я ставил карусель за 5 минут (jquery + owl carousel), а он за пол дня свой велосипед. В итоге его уволили за низкую производительность. Хотя писал качественно.
    Ответ написан
  • Какая разница между патернами?

    @MaxKorz
    эм... между ними колоссальная разница. Они структурно совершенно разные.
    Первый паттерн - самовызывающаяся функция, которая просто возвращает объект с функциями. То есть
    var App = (function(){
      return {
        method1: function() {
          return this;
        },
        method2: function() {
          return this;
        }
      }
    })();

    и
    var App = {
        method1: function() {
          return this;
        },
        method2: function() {
          return this;
        }
      };

    это одно и тоже. С двумя отличиями:
    1. самовызывающая функция позволяет скрыть внутренности "класса"
    2. самовызывающая функция имеет "this"

    Например так можно скрыть приватные методы:
    var App = (function(){
      function helper() {
        console.log('helper()');
      }
    
      function method1() {
        console.log('method1()');
        helper();
      }
      return {
        method1: method1,
        method2: function() {
          return this;
        }
      }
    })();

    таким образом функция helper не становится публичной
    4hamX9w.png

    А второй паттерн это класс через прототип. Почитайте по ссылке, там все подробно объяснено. И это уже не объект, а функция. В console.log вы увидите следующее BU13wh7.png

    Разница для вас будет в том, что используя прототипы вы сможете реализовать наследование, использовать constructor и вообще ES6 классы это сахар над прототипами.
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (43)