Javascript的作用域、安全性和扩展
Javascript scope, security, and extension
我读了很多关于Javascript作用域的文章,并产生了我想要的功能——我想我应该把这个问题放在一个地方来澄清如何/为什么。
在我的情况下,我使用的是传单-一个javascript库映射。
我的第一个问题是"L"是什么。
例如,我可以使用下面的代码:current_map = L.map(map_id);
L代表什么?为什么我可以通过它访问函数?
其次,在我的网站上,我有多个不同的地图共享一些共同的代码,例如设置地图。
因此,我想开发一些"通用代码",例如可以设置地图和添加标记。
所以我在map_global.js中编写了以下代码: var current_map;
window.setup_map = function(map_id)
{
if ($("#"+map_id)[0])
{
$("#"+map_id).show();
current_map = L.map(map_id);
}
}
然后在我的map_individual.js文件中我简单地写:
map_setup('map_div');
and my map is setup.
我可以这样做,因为通过在定义函数名中使用窗口,我将函数设置在全局作用域中。同样地,通过设置变量current_map以外的任何函数,它也是全局的?
这是实现此功能的有效/安全/合理的方法吗?
最后为什么我不能访问map_individual.js中的current_map ?
许多谢谢。汤姆这是变量作用域的问题。
从概念上将"L"看作一个名称空间。L向您公开方法,例如map、L.map()。
看起来你想公开你的"current_map"变量。在map_global.js文件中,current_map目前是一个局部变量——因为你用var声明了它。所以map_global.js作用域之外的任何东西都不能访问current_map.
如果你想在map_individual.js中快速而肮脏地访问current_map,你可以通过设置全局窗口来暴露它。将current_map设置为L.map(map_id),因此更改current_map变量的作用域。
这当然会导致污染全局作用域,所以你可以探索的一件事是如何实现"模块化"客户端javascript。一种简单的方法是实现您自己的名称空间。例如,在map_global.js中,你可以只暴露一个"对象"——你自己的命名空间——并将其附加到window。你可以使用你的命名空间来访问current_map和setup_map(),如果你把这些方法和变量附加到那个"对象"上,而不是把你所有的方法和变量直接附加到窗口——全局命名空间——这可能会很快失控。
function setup_map(){ ...}
var current_map;
window.my_lib = {
setup_map = setup_map,
current_map = current_map
}
my_lib.setup_map () ,和 my_lib。current_map可以在以后以这种方式访问,因为您只将my_lib设置为全局。想象一下,如果my_lib公开了十几个函数,其思想是这将更有组织,而不是将所有十几个函数附加到window - global命名空间。当你有不同的文件/"模块",其中的函数命名相同时,这会派上用场。这样,您就可以拥有my_lib.render()和client_lib.render(),而不会相互覆盖,并保持这种分离,作为降低覆盖全局命名空间中已经存在的内容的风险的一种方式。
注意导入脚本的顺序也很重要!还有一些库,比如RequireJS, CommonJS,只是举几个例子,它们试图处理整个模块化的依赖方面,值得探索。所以小心行事,希望这能有所帮助!
- Node.js v6.2.0类扩展不是函数错误
- 扩展移相器按钮类不工作
- chrome扩展中的navigator.geolocation.getCurrentPosition
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- chrome扩展更改主机/域警告
- TableExport jquery插件:文件名和扩展名问题
- 如何在chrome扩展中重定向到html页面
- Chrome扩展没有't在重新加载之前考虑期权价值
- 扩展SVGTextElement时出现Typescript Uncaught TypeError
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- Javascript”;类“;带有参数的扩展
- 试图阻止Chrome通过扩展关闭
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- 表达式引擎扩展开发-向呈现的条目添加自定义javascript
- 从选项页面更新chrome扩展清单权限
- 如何将chrome扩展功能移植到移动设备(特别是jquery和trello)
- Chrome扩展:遍历不同的页面并收集数据
- DataTable按下键选择扩展/导航
- 扩展jQuery插件以更改配置
- Javascript的作用域、安全性和扩展