Javascript 在对象中存储文档和窗口引用以获得更好的性能
我有一个问题,不知道我做对了什么 我在我的pluins中的对象或全局变量中定义Javascript 在对象中存储文档和窗口引用以获得更好的性能,javascript,performance,micro-optimization,Javascript,Performance,Micro Optimization,我有一个问题,不知道我做对了什么 我在我的pluins中的对象或全局变量中定义窗口和文档,如下所示: var myplugin = { document : document || {}, window : window || {} }; myplugin.window.location.href = 'http://flyflyflymachine.etc'; 当我需要这样做时,我打电话给他: var myplugin = { document : docum
窗口
和文档
,如下所示:
var myplugin = {
document : document || {},
window : window || {}
};
myplugin.window.location.href = 'http://flyflyflymachine.etc';
当我需要这样做时,我打电话给他:
var myplugin = {
document : document || {},
window : window || {}
};
myplugin.window.location.href = 'http://flyflyflymachine.etc';
我想知道我是获得了更好的性能还是不必要的性能?您似乎担心
窗口
或文档
不存在。例如,如果此代码是从Worker或NodeJS脚本内部运行的,它将抛出一个错误
因此,您可以通过两种方式“优化”它:
使用带有this
关键字的命名空间(从全局范围来看,this
将引用全局对象)
用好的方式试着接球
var myPlugin = {};
try {
myPlugin.window = window;
} catch (e) {
myPlugin.window = {};
}
try {
myPlugin.document = document;
} catch (e) {
myPlugin.document = {};
}
诚然,这不是一个真正的“优化”,但它至少可以确保您的代码可以在各种JS运行时运行。您似乎担心
窗口或文档不存在。例如,如果此代码是从Worker或NodeJS脚本内部运行的,它将抛出一个错误
因此,您可以通过两种方式“优化”它:
使用带有this
关键字的命名空间(从全局范围来看,this
将引用全局对象)
用好的方式试着接球
var myPlugin = {};
try {
myPlugin.window = window;
} catch (e) {
myPlugin.window = {};
}
try {
myPlugin.document = document;
} catch (e) {
myPlugin.document = {};
}
诚然,这并不是一个真正的“优化”,但它至少可以确保您的代码可以在各种JS运行时运行。至于性能,是的,缓存可以帮助您,但您没有在这里缓存任何东西。只需将一个查找替换为另一个(yourplugin.document
vswindow.document
)
实际上,在这种情况下,只需文档
就可以更快,但除非您在一个严格的循环中调用它几千次,否则不要为这些纳米优化而烦恼。至于性能,是的,缓存可以帮上忙,但您不会在这里缓存任何东西。只需将一个查找替换为另一个(yourplugin.document
vswindow.document
)
实际上,在这种情况下,只需文档
就可以更快,但除非您在一个紧密的循环中调用它几千次,不要为这些纳米优化而烦恼。理论上,这种纳米优化更适用于插件根据IIFE定义时创建的嵌套函数,而不是使用对象文字初始值设定项
当代码引用对象的变量时,javascript引擎必须首先搜索当前的词法范围记录,然后搜索任何父词法范围记录,直到找到或证明未定义该变量或对象定义
使用let
变量定义为for
循环创建词法范围记录,并为保存参数和变量的函数创建词法范围记录。因此,在深度嵌套的for
循环中,在深度嵌套函数中,在查找窗口或文档之前,可能需要检查许多范围记录
复制全局或外部函数引用可以减少要搜索的范围记录的数量。只有当制作副本的开销小于JavaSript引擎搜索中间作用域记录的开销乘以使用外部引用的次数时,才会产生净性能增益。这在实践中可能很少见,如果收益很小,则很难证明
文章中的插件定义由“Object Object”初始化器而不是IIFE组成,不符合加快对象引用搜索的标准,事实上,实际上可能会减慢速度。理论上,这种纳米优化更适用于根据IIFE定义插件时创建的嵌套函数,而不是使用对象文字初始值设定项
当代码引用对象的变量时,javascript引擎必须首先搜索当前的词法范围记录,然后搜索任何父词法范围记录,直到找到或证明未定义该变量或对象定义
使用let
变量定义为for
循环创建词法范围记录,并为保存参数和变量的函数创建词法范围记录。因此,在深度嵌套的for
循环中,在深度嵌套函数中,在查找窗口或文档之前,可能需要检查许多范围记录
复制全局或外部函数引用可以减少要搜索的范围记录的数量。只有当制作副本的开销小于JavaSript引擎搜索中间作用域记录的开销乘以使用外部引用的次数时,才会产生净性能增益。这在实践中可能很少见,如果收益很小,则很难证明
文章中的插件定义由一个“Object Object”初始化器而不是IIFE组成,不符合加快对象引用搜索的标准,事实上,可能会减慢搜索速度。我们通常使用窗口。位置对吗?不是另一个。是的,我写得很快。我的错误。第一个问题,说真的,为什么?预期访问的窗口
实例是否不止一个?微优化在大多数情况下是不必要的。我们通常使用窗口。位置
对吗?不是另一个。是的,我写得很快。我的错误。第一个问题,说真的,为什么?预期访问的window
实例是否不止一个?在大多数情况下,微优化是不必要的。在worker内部,您使用self
引用特定于worker的window对象,它是宿主window对象的子集,您说过将此
传递到该函数是wrong@Dummy呃。。你能发布一个这个不起作用的代码片段吗?它在我编写的代码中工作。我想你