Это лучшее объяснение, которое я видел. Понимать JavaScripts это с помощью Clarity
Ссылка эта ALLWAYS означает (и содержит значение) объект - особый объект - и он обычно используется внутри функции или метода, хотя он может использоваться вне функции в глобальной области. Обратите внимание, что когда мы используем строгий режим, это содержит значение неопределенных в глобальных функциях и анонимных функциях, которые не привязаны к какому-либо объекту.
Существуют четыре условия, в которых это может запутать:
- Когда мы передаем метод (который использует этот ) в качестве параметра, который будет использоваться в качестве функции обратного вызова.
- Другой пример, когда это неправильно понимается, - это когда мы используем внутренний метод (замыкание). Важно отметить, что закрытие не может получить доступ к переменной этой внешней функции внешней функции], используя это ключевое слово, потому что эта переменная доступна только самой функции, а не внутренними функциями.
- Используя этот , когда метод присваивается переменной. Значение этого привязано к другому объекту, если мы назначим метод, который использует это для переменной
- Используя этот при использовании bind, apply и
Он дает примеры кода, объяснения и исправления кода, которые, как я думал, очень полезны.
Рассмотрим это, когда generateString
делает много вещей для генерации строки из someParam
:
Objects.requireNonNull(obj, generateString(someParam));
Аргументы оцениваются с нетерпением в Java, что означает, что generateString
будет оценивается до вызова requireNonNull
. Поэтому он вычисляется независимо от того, является ли obj
нулевым или нет.
Вы можете исправить эту проблему, изменив ее следующим образом:
Objects.requireNonNull(obj, () -> generateString(someParam));
В этом случае вызов generateString
будет вызван только в том случае, если obj
на самом деле было нулевым. Это более эффективно, когда generateString
дороже, чем создание Supplier
-объекта.
Вы должны просто использовать обычный не лямбда-метод, если ваш параметр String является просто литералом, например:
Objects.requireNonNull(obj, "obj was null!");