Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.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_Scope_Global Variables_Leaflet - Fatal编程技术网

Javascript作用域、安全性和扩展

Javascript作用域、安全性和扩展,javascript,scope,global-variables,leaflet,Javascript,Scope,Global Variables,Leaflet,我已经读了很多关于Javascript作用域的书,并且已经产生了我想要的功能——我想我应该在一个地方发布这个问题来澄清一下如何/为什么 在我的例子中,我使用的是一个用于映射的javascript库 我的第一个问题是“L”是什么 例如,我可以使用以下代码: current_map = L.map(map_id); L代表什么?为什么我可以通过它访问函数 其次,在我的网站上,我有许多不同的地图,分享一些共同的代码,例如设置地图 因此,我想开发一些“通用代码”,例如设置地图和添加标记 因此,我在ma

我已经读了很多关于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');
我的地图已经设置好了

我可以这样做,因为通过在定义函数名中使用window,我可以在全局范围内设置函数。同样,通过在任何函数外部设置变量current_map,它也是全局的

这是实现此功能的有效/安全/合理的方法吗

最后,为什么我不能访问map_individual.js中的当前地图

非常感谢


Tom

这是一个变量范围的问题

将“L”概念上看作一个名称空间。L向您公开方法,例如map、L.map()

看起来您想公开“当前映射”变量。在map_global.js文件中,current_map当前是一个局部变量,因为您使用var声明了它。因此,map_global.js范围之外的任何内容都无法访问当前的地图

如果您想要一种快速而肮脏的方式来访问map_individual.js中的current_map,可以通过将global window.current_map设置为L.map(map_id)来公开它,因此更改current_map变量的范围

这当然会污染全局范围,因此您可以探索如何实现“模块化”客户端javascript。一种简单的方法是实现自己的名称空间。例如,在map_global.js中,您可以只公开一个“对象”——您自己的名称空间——并将其附加到窗口。如果将这些方法和变量附加到该“对象”,而不是将所有方法和变量直接附加到窗口(全局名称空间),则可以使用名称空间访问当前的\u map和setup\u 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设置为全局。想象一下,如果我的_lib公开了十几个函数,其思想是这将更有组织性,而不是将所有十几个函数都附加到窗口全局名称空间。当您有不同的文件/“模块”且其函数名称相同时,这会很方便。这样,您就可以使用my_lib.render()和client_lib.render(),而不必相互覆盖,并保持这种分离,以降低覆盖全局命名空间中已有内容的风险


请注意,导入脚本的顺序也很重要!还有一些库,比如RequireJS、CommonJS,只是举几个例子,它们试图处理整个模块化过程中的依赖性方面,这是值得探索的。所以请小心行事,希望这能有所帮助

L
被传单定义为一种保持传单所有功能自包含且不污染全局范围的方法(它创建了一个名称空间)。这与jQuery使用
$
的方式类似。很多图书馆都做了类似的事情。那么,在我的情况下,如果我愿意,我可以做类似的事情,以免污染全球范围?如何做到这一点?好极了。效果很好。谢谢