Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在对象中存储文档和窗口引用以获得更好的性能_Javascript_Performance_Micro Optimization - Fatal编程技术网

Javascript 在对象中存储文档和窗口引用以获得更好的性能

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

我有一个问题,不知道我做对了什么

我在我的pluins中的对象或全局变量中定义
窗口
文档
,如下所示:

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
vs
window.document


实际上,在这种情况下,只需
文档
就可以更快,但除非您在一个严格的循环中调用它几千次,否则不要为这些纳米优化而烦恼。

至于性能,是的,缓存可以帮上忙,但您不会在这里缓存任何东西。只需将一个查找替换为另一个(
yourplugin.document
vs
window.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呃。。你能发布一个
这个
不起作用的代码片段吗?它在我编写的代码中工作。我想你