繁体   English   中英

为什么在Javascript函数声明中使用未定义的对象?

[英]Why can we use undefined object in Javascript function declaration?

Chromium WebUI有一个cr.js文件,该文件提供了cr.define( name, fun )方法进行调制。 该对象的所有调性质是fun的回报,将被添加到该name名称范围对象。

在Chrome浏览器书签管理器页面(chrome:// bookmarks)中,加载了名为bmm.js的Javascript源文件。 这是书签管理器中的Javascript模块。

以下是使用cr.define()bmm.js文件的一部分,该文件定义了许多方法,然后将它们添加到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
  };
});

cr.define();的第二个参数cr.define(); 是一个匿名函数表达式,将对其进行解析和执行,返回的值是一个对象,然后将其作为参数传递给cr.define()

请注意,在函数function contains()函数声明中,使用了bmm对象,该对象在解析此函数主体时应未定义。

为什么在定义bmm及其方法treeLookup之前可以使用它们?

是否对contains()的函数体进行了解析并保存为语法树,其中的许多节点都是tokens = undefined?

无法对其进行解析并将其保存在原始源代码中,因为这意味着根本就不会对其进行解析。

cr.define()的第二个参数是一个匿名函数表达式,将对其进行解析和执行,返回值是一个对象,然后将其作为参数传递给cr.define()

实际上不是。 它只是作为函数传递给cr.define ,而没有被调用。 它是从那里执行的:

var exports = fun();

请注意,在函数function contains()函数声明中,使用了bmm对象,该对象在解析此函数主体时应未定义。

是。 这一点都不重要。 这只是一个名为bmm的自由变量。

仅在调用该函数时才能解决。

为什么在定义bmm及其方法treeLookup之前可以使用它们?

它们不被使用- contains不被调用。 它们只是解析时的标识符。 仅当实际执行代码时,才会动态分派方法调用。

contains()的函数体是否已解析并保存为语法树?

是。 这就是解析的作用。

令牌=未定义在哪个节点内?

否。语法树不存储值。 用于存储这些记录的记录以及值本身都是在运行时创建的。 只有这样才能进行分配和查找。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM