Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Каково использование рекурсивного вызова
blockquote>function(w)
вmodule.exports
?Это не рекурсивный вызов, а больше функция отложенной инициализации. В некоторых средах CommonJS, таких как Node.JS, глобальный объект не имеет свойства
document
, в то время как другие, такие как Browserify и Webpack.jQuery требует, чтобы свойство
document
инициализировалось, поэтому оно сначала проверьте, содержит ли глобальный объект свойствоdocument
. Если это так, он инициализирует немедленно, делая среду браузера CommonJS счастливой. Если это не так, он возвращает функцию, которая может быть использована для последующей инициализации jQuery. Эта функция может быть позже вызвана в поддельном окне, создавая с чем-то вроде jsdom.
Какая польза от переменной
blockquote>noGlobal
?Здесь используется переменная
noGlobal
.// Expose jQuery and $ identifiers, even in // AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557) // and CommonJS for browser emulators (#13566) if ( typeof noGlobal === strundefined ) { window.jQuery = window.$ = jQuery; }
По существу, если
noGlobal
-undefined
, jQuery добавит себя к глобальному объектуwindow
. Единственный раз, когда он этого не сделает, будет загружен загрузчиком CommonJS со свойствомdocument
на глобальном объекте, таким как Browserify или Webpack. Ниже приведен вызов:noGlobal
неundefined
.factory( global, true )
Где действительно установлен
< / blockquote>factory
и каков его тип?Переменная
factory
являетсяfunction
, и она заявлена здесь:function( window, noGlobal ) {
Это второй аргумент, переданный в IIFE .
Почему аргумент
blockquote>factory
вызывается с одним аргументом и с двумя?Поскольку JavaScript.
В JavaScript нет требования сопоставлять количество аргументов, объявленных функцией. Любые опущенные аргументы имеют значение
undefined
.
Что должен содержать аргумент
blockquote>global
? (Мне жаль, что не было такого типа, как в c ++ ...)Предполагается, что он содержит глобальный объект для среды JavaScript. В браузере этот объект известен как
window
, а в узле этот объект известен какglobal
. В обеих средах использованиеthis
в глобальной области будет разрешено для глобального объекта, независимо от его глобального имени.Однако из-за некоторых сторонних оболочек, которые могут изменять область, в которой jQuery initialized, jQuery сначала проверит, доступен ли объект
window
и использует его, если он есть. Если не использовать, по умолчанию будет использоватьсяthis
.typeof window !== "undefined" ? window : this
еще один вопрос: где аргумент w, исходящий из?
blockquote>Если глобальный объект не содержит
document
, он возвращает функцию, которая принимает один аргумент,w
. Этот объект будетwindow
-подобным объектом сdocument
, который может быть создан с помощью чего-то вроде jsdom.
document
, он возвращает функцию, которая принимает один аргумент,w
. Этот объект будетwindow
-подобным объектом сdocument
, который может быть создан с помощью чего-то вроде jsdom. – Alexander O'Mara 12 May 2015 в 14:13var $ = require('jquery')(myFakeWindow);
, гдеmyFakeWindow
- созданный вами оконный объект. – Alexander O'Mara 12 May 2015 в 16:09