2015-06-16 16 views
0

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?

Он не может быть проанализирован и сохранен в исходном исходном коде, поскольку это означает, что он вообще не разбирается.

+1

_ "возвращаемое значение - это объект, который затем передается в cr.define() как аргумент" _ ... на самом деле это похоже на то, что сама функция передается в 'cr.define' в качестве аргумента. – Xufox

ответ

3

2-й аргумент cr.define() является анонимным выражение функции, он обрабатывается и выполняется, возвращаемое значение является объектом, который затем передается в качестве аргумента cr.define().

На самом деле это не так. Он просто передается как функция в cr.define, не будучи вызванным. Он выполнен из within there:

var exports = fun(); 

Уведомления в объявлении функции function contains(), там используется bmm объекта, который должен быть не определен в то время этой функции тело разбираемого.

Да. И это не имеет значения. Это просто свободная переменная с именем bmm.

Он будет разрешен только при вызове функции.

Почему мы не используем bmm и его метод treeLookup, прежде чем они будут определены?

Не используются - contains не вызывается. Это просто идентификаторы во время разбора. Вызов метода будет отправляться динамически только тогда, когда код действительно выполняется.

Является ли тело функции проанализировано и сохранено в виде дерева синтаксиса?

Да. Это то, что делает синтаксический анализ.

В пределах которого многие узлы являются токенами = undefined?

No. Дерево синтаксиса не хранит значения. Записи для их хранения создаются во время выполнения, а также сами значения. Только тогда будут выполняться задания и поисковые запросы.

Смежные вопросы