这篇文章主要为大家展示了“js如何减少作用域查找”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js如何减少作用域查找”这篇文章吧。
减少作用域查找
(1)不要让代码暴露在全局作用域下
例如以下运行在全局作用域的代码:
<script> var map = document.querySelector("#my-map"); map.style.height = "600px"; </script>
有时候你需要在页面直接写一个 script,要注意在一个 script 标签里面,代码的上下文都是全局作用域的,由于全局作用域比较复杂,查找比较慢。例如上面的 map 变量,第二行在使用的时候,需要在全局作用域查找一下这个变量,假设 map 是在一个循环里面使用,那可能就会有效率问题了。所以应该要把它搞成一个局部的作用域:
<script> !function(){ var map = document.querySelector("#my-map"); map.style.height = "600px"; }() </script>
上面用了一个 function 制造一个局部作用域,也可以用 ES6 的块级作用域。由于 map 这个变量直接在当前的局部作用域命中了,所以就不用再往上一级的作用域(这里是全局作用域)查找了,而局部作用域的查找是很快的。同时直接在全局作用域定义变量,会污染 window 对象。
(2)不要滥用闭包
闭包的作用在于可以让子级作用域使用它父级作用域的变量,同时这些变量在不同的闭包是不可见的。这样就导致了在查找某个变量的时候,如果当前作用域找不到,就得往它的父级作用域查找,一级一级地往上直到找到了,或者到了全局作用域还没找到。因此如果闭包嵌套得越深,那么变量查找的时间就越长。如下:
function getResult(count){ count++; function process(){ var factor = 2; return count * factor - 5; } return process(); }
上面的代码定义了一个 process 函数,在这个函数里面 count 变量的查找时间要高于局部的 factor 变量。其实这里不太适合用闭包,可以直接把 count 传给 process:
function getResult(count){ count++; function process(count){ var factor = 2; return count * factor - 5; } return process(count); }
这样 count 的查找时间就和 factor 一样,都是在当前作用域直接命中。这个就启示我们如果某个全局变量需要频繁地被使用的时候,可以用一个局部变量缓存一下,如下:
var url = ""; if(window.location.protocal === "https:"){ url = "wss://xxx.com" + window.location.pathname + window.location.search; }
频繁地使用了 window.location 对象,所以可以先把它缓存一下:
var url = ""; var location = window.location; if(location.protocal === "https:"){ url = "wss://xxx.com" + location.pathname + location.search; }
搞成了一个局变变量,这样查找就会明显快于全局的查找,代码也可以写少一点。
以上是“js如何减少作用域查找”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。