ошибка "не является функцией", когда в коде есть другая не связанная функция - PullRequest
0 голосов
/ 15 января 2019

У меня есть два куска кода, каждый из которых работает как положено:

function Test() {}

let tmp = function() {
    console.log(this)
}
tmp.call(Test)

и

function Test() {}

(function() {
    console.log(this)
}).call(Test)

Они оба дают ожидаемый результат: [Function: Test].

Однако, когда эти независимые фрагменты кода объединяются, это приводит к ошибке. Итак, запускаем следующий код

function Test() {}

let tmp = function() {
    console.log(this)
}
tmp.call(Test)

(function() {
    console.log(this)
}).call(Test)

Результаты в

TypeError: tmp.call(...) is not a function

Я нашел не элегантное исправление для этого, которое добавляет задержку ко второму фрагменту кода. Таким образом, следующее даст желаемый результат ([Function: Test] дважды):

function Test() {}

let tmp = function() {
    console.log(this)
}
tmp.call(Test)

setTimeout(() => {
    (function() {
        console.log(this)
    }).call(Test)
}, 100);

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

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вот как интерпретируется ваш фрагмент кода:

function Test() {}

let tmp = function() {
    console.log(this)
}
tmp.call(Test)(function() {
    console.log(this)
}).call(Test)

Чтобы исправить это, добавьте точку с запятой после tmp.call(Test)

0 голосов
/ 15 января 2019

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

tmp.call(Test)

(function() {
    console.log(this)
}).call(Test)

интерпретируется как если бы оно было написано

tmp.call(Test)(function() { console.log(this) }).call(Test)

Если вводится точка с запятой:

tmp.call(Test);

(function() {
    console.log(this)
}).call(Test)

тогда будет работать.

Точные правила включают в себя некоторый "юридический", который довольно трудно переварить, но основная идея (в данном случае) заключается в том, что точка с запятой не будет вставлена, когда выражение может синтаксически работать, когда символ новой строки считается простым пробел.

...