[英]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.