Вопросы, связанные с JS, на фронтенд-интервью (1)

внешний интерфейс переводчик JavaScript опрос

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

Как это работает в JavaScript?

Сначала рассмотрим эту тему:

var x = 0;
var foo = {
    x:1,
    bar:{
    x:2,
    baz: function () {
       console.log(this.x)
     }
    }
}

var a = foo.bar.baz
foo.bar.baz() // 2
a() //0
  • это всегда указывает на объект, где была запущена функция, а не на объект, где функция была создана
  • Анонимные функции и функции, которых нет ни в одном объекте, Это указывает на окно
  • звоните, обращайтесь, со ссылкой кто это.
  • Обычный вызов функции, кто бы ни вызывал функцию, это указывает на

В приведенном выше примере baz вызывается bar, поэтому он указывает на bar.Объект, в котором выполняется a, — это window, поэтому он указывает на окно.

цепочка прицелов?

Понимание среды выполнения и контекста

Вызовы функций имеют связанную с ними область действия и контекст. По сути, область видимости основана на функциях, а контекст — на объектах. Другими словами, область действия связана с доступом к переменной при каждом вызове функции, и каждый вызов независим. Контекст всегда является значением ключевого слова this, которое является ссылкой на объект, вызвавший текущий исполняемый код.

общий доступ к контексту выполненияglobal,function,eval, функция может генерировать бесконечное количество контекстов выполнения, последовательность контекстов выполнения логически формирует стек контекстов выполнения, нижняя часть стека всегда является глобальным контекстом, а вершина стека — текущим (активным) контекстом выполнения.

Три атрибута контекста выполнения: этот указатель, переменный объект (область данных), цепочка областей видимости

Цепочка областей действия То есть: переменная не находится в своей области видимости, тогда она будет искать родителя, вплоть до верхнего уровня. Процесс выглядит следующим образом:

  • Любая область во время контекста выполнения реализуется цепочкой областей видимости.
  • Когда функция определена, цепочка областей во время ее определения связана со свойством [[scope]] объекта функции.
  • При вызове объекта-функции будет создан активный объект (то есть объект), а затем формальные параметры каждой функции именуются как именованный атрибут активного объекта, а затем активный объект используется как объект. передний конец цепочки областей видимости, и [[scope]] функционального объекта добавляется в цепочку областей видимости.

Вы можете обдумать приведенный выше текст, чтобы лучше понять область действия функции.

Усилить декларации функций и лифт переменной декларации (подъемное)?

Давайте сначала разберемся с процессом выполнения кода компилятором js:
В качестве примера возьмем выполнение фрагмента кода функции:
Шаг 1: Создайте исполняемый контекст (далее EC) и поместите его в текущий стек EC. В ЭК включается следующая информация:

  • Лексическое окружение (= запись окружения (содержащая переменные, объявления функций и формальные параметры) + внешнее лексическое окружение ([[scope]] атрибут функции, суть цепочки областей видимости))
  • указатель на это
  • Переменная среды (то же значение, что и запись среды, но больше не изменяется).

Шаг 2: Соберитеобъявление функции,объявление переменнойа такжеформальный параметр, который хранится в записи записи среды. Этот процесс сбора является сущностью так называемого феномена снятия утверждений. Если обнаружены повторяющиеся идентификаторы, топриоритетдляобъявление функции,формальный параметр,объявление переменной(Меньший приоритет будет проигнорирован).

Шаг 3: Запустите выполнение кода.Идентификаторы, которых нет в элементе записи среды, будут искать значение, соответствующее идентификатору, в соответствии с цепочкой области действия.Элемент записи среды также может быть изменен оператором присваивания.

Шаг 4: После выполнения функции стек EC извлекается и уничтожается.

Что ж, второй шаг очень ясен.Феномен подъема заключается в том, что в процессе сбора функций, объявлений переменных и формальных параметров он будет собираться в соответствии с порядком приоритета объявлений функций, формальных параметров и объявлений переменных.

пример:

var a = 1;  
function b() {  
    a = 10;  
    return;  
    function a() {}  
}  
b();  
console.log(a); 
// 输出1 由于函数声明提升,b内的实际是这样:
// function b() {  
//    function a() {}; 这里是函数声明提升
//    a = 10;  
//    return;  
//    function a() {}  
// }
Вы понимаете?
Errata: Спасибо за ваши исправления на githubО выпуске в блоге · Выпуск №1 · stephenzhao/hexo-theme-damon, правильное выполнение выше должно быть предварительно скомпилировано, поэтому сначала выполняется функция a(){}, а затем будет выполнено присваивание a.
//正确的顺序应该为:
// function b() {  
//    function a() {}  
//    a = 10;  
//    return;  
// }

Что такое замыкание, как его использовать и почему?

Или в теме выше сделать деформацию.

var x = 0;
var foo = {
    x:1,
    bar:function () {
        console.log(this.x);
        var that = this;
        return function () {
           console.log(this.x)
           console.log(that.x)
        }
    }
}


foo.bar()       // 1
foo.bar()()     // this: 0, that: 1

В приведенном выше примере ba'r возвращает анонимную функцию, которую можно вызвать извне, а именно: foo.bar()() считывает объект переменной контекста выполнения bar, и эта функция формирует закрытый Bag.

Что ж, мы понимаем приведенную выше процедуру, и легко понять замыкание ниже.

Замыкания — это функции, которые могут читать переменные внутри других функций.

В языке Javascript только подфункции внутри функций могут читать локальные переменные, поэтому замыкания можно просто понимать как «функции, определенные внутри функции».

var x = 0;
var bar:function () {
        var n = 999;
        return function () {
           return n;
        }
    }
var outer = bar();
outer() // 999

использовать:

  1. читать переменную внутри функции
  2. сохранить значения этих переменных в памяти

Давайте изменим код выше

var add;
var bar = function () {
        var n = 999;
        add = function () {
            n += 1;
        }
        return function () {
           return n;
        }
    }
var outer = bar();
outer() // 999 
add();
outer(); // 1000

Обратите внимание, что n всегда хранится в памяти и не уничтожается после выполнения bar();
причина:
Анонимная функция в bar назначается external, что приводит к тому, что когда external не уничтожается, анонимная функция всегда существует в памяти, а существование анонимной функции зависит от bar, поэтому bar необходимо использовать в памяти, поэтому bar not Он не будет восстановлен механизмом сборки мусора после завершения вызова.

Вышеупомянутое добавление также принимает анонимную функцию, а сама анонимная функция также является замыканием, поэтому переменными внутри также можно манипулировать извне.

будь осторожен

  1. Вызывает утечку памяти, используйте с осторожностью
  2. Замыкания изменяют значения внутренних переменных, поэтому будьте осторожны при использовании замыканий в качестве публичных методов объектов.
    Применение замыканий, шаблон singleton

Определение шаблона singleton заключается в создании единственного экземпляра класса.

Шаблон singleton часто встречается в js, например, var a = {}; на самом деле это единственный пример.

Но давайте напишем более осмысленный синглтон:

var singleton = function( fn ){
    var result;
    return function(){
        return result || ( result = fn .apply( this, arguments ) );
    }
}

Немного более кратким:

var singleton = (function () {
    var instance;
    return function (object) {
        if(!instance){
            instance = new object();
        }
        return instance;
    }
    })();

Снова полночь. Последние два дня я смотрю Олимпиаду в Рио. Матч между Линь Дань и Ли Цзунвэй — самая захватывающая игра, которую я видел в этом году после последней игры финала НБА. Великому герою нужен еще один великий противник, чтобы добиться успеха, благодаря Линь Дану, благодаря Ли Чонг Вэю, мир запомнит вас. Спокойной ночи.

В следующей статье объясняются некоторыеjs объектно-ориентированный, обратите внимание на мою колонку"Фронтальный продуктовый магазин"