Chromium WebUI имеет файл cr.js, который предлагает метод cr.define(name, fun)
, для модуляции. Все свойства объекта, возвращаемого fun
, будут добавлены к объекту именного объекта name
.Почему мы можем использовать неопределенный объект в объявлении функции Javascript?
На странице менеджера закладок браузера Chrome (chrome: // bookmarks) загружен исходный файл Javascript с именем bmm.js
. Это модуль Javascript в менеджере закладок.
Ниже приведена часть файла bmm.js с использованием cr.define()
, который определяет множество методов, а затем добавляет их в объект bmm
.
cr.define('bmm', function() {
'use strict';
function contains(parent, descendant) {
if (descendant.parentId == parent.id)
return true;
// the bmm.treeLookup contains all folders
var parentTreeItem = bmm.treeLookup[descendant.parentId];
if (!parentTreeItem || !parentTreeItem.bookmarkNode)
return false;
return this.contains(parent, parentTreeItem.bookmarkNode);
}
// ... more function definitions ...
return {
contains: contains,
isFolder: isFolder,
loadSubtree: loadSubtree,
loadTree: loadTree,
addBookmarkModelListeners: addBookmarkModelListeners
};
});
2-й аргумент cr.define();
является анонимным выражение функции, он обрабатывается и выполняется, возвращаемое значение является объектом, который затем передается в качестве аргумента cr.define()
.
Уведомление в объявлении функции function contains()
, здесь используется объект bmm
, который должен быть неопределенным в момент разбора этого тела функции.
Почему мы не можем использовать bmm
и его метод treeLookup
, прежде чем они будут определены?
Разбирается ли тело функции contains() и сохраняется как дерево синтаксиса, внутри которого много узлов являются токенами = undefined?
Он не может быть проанализирован и сохранен в исходном исходном коде, поскольку это означает, что он вообще не разбирается.
_ "возвращаемое значение - это объект, который затем передается в cr.define() как аргумент" _ ... на самом деле это похоже на то, что сама функция передается в 'cr.define' в качестве аргумента. – Xufox