有人能解释一下这个require.js示例中涉及的语法吗

Can someone explain the syntax involved in this require.js example?

本文关键字:js 语法 require 能解释 一下      更新时间:2023-09-26

我希望这个问题不要太宽泛,但在这个特殊的require.js/ESRI示例中发生了很多不熟悉的语法,我希望有人能向我解释其中的一些。

首先,这段代码是有效的(也就是说,它做了我期望它做的事情):它创建了一个基础地图,并添加了一个从地图服务中提取的FeatureLayer。这是ESRI Javascript API页面中一个示例的分条下载版本。这是代码:

    var map;
    var featureLayer;
    require(["esri/map", "dojo/domReady!", "esri/layers/FeatureLayer"], function (Map) {
        map = new Map("map", {
            basemap: "topo",
            center: [-100.195, 39.567], // long, lat
            zoom: 4
        });
        featureLayer = new esri.layers.FeatureLayer(
            "http://my-server-url.com/arcgis/rest/services/Projects/MapServer/0",
            {
                mode: esri.layers.FeatureLayer.MODE_ONDEMAND
            }
        );
        map.addLayer(featureLayer);
    });

现在针对特定问题:

  1. 这需要([…],函数(args){}语法做什么?我甚至不知道该怎么读。它是对require.js的函数调用吗?方括号里有什么?函数参数是什么?

  2. 从其他示例来看,require.js调用中的每个include通常应该有一个函数参数。但在这里,如果我为FeatureLayer添加一个参数,它就不起作用。

  3. 在任何示例中,"dojo/domReady!"include似乎都没有相应的参数。这与感叹号有关吗?感叹号是什么意思?

  4. 有人能给我指一个有用的require.js参考吗?requirejs.org网站读起来更像是技术规范,而不是用户手册。ESRI网站似乎认为你知道如何使用require。

是的,我一直在谷歌上搜索——问题是谷歌不擅长搜索计算机语法问题,因为它去掉了标点符号,而且"需要javascript语法"之类的词会导致糟糕的(过于宽泛的)搜索词。

  1. require([...], function(args) { }语法表示"加载此模块列表,一旦它们全部加载,就用这些模块的返回值作为参数来调用此函数"。方括号中的是指向脚本文件(减去.js)或使用require.config路径部分映射的模块ID的路径数组。回调函数的参数对应于数组中的路径/模块,但并非所有模块都返回有用的值,正如您在下一个问题中注意到的那样。。。

  2. 为FeatureLayer添加参数无效,因为无法跳过参数。但请注意,许多模块实际上并没有返回要使用的值。你会在jQuery插件中看到很多这种情况,其中模块的加载只是向jQuery注册插件,但不会向调用方返回值。我不知道ESRI,但从代码片段来看,加载FeatureLayer只是将FeatureLayer添加到ESRI.layers全局对象中。

  3. 感叹号语法是为插件保留的。通常,感叹号后面会有其他东西,指示插件将加载的资源,例如text!myTemplate.html,但在domReady!的情况下,插件的存在只是为了等待DOM加载后再调用回调函数,所以感叹号后面不需要任何东西。

  4. 外部资源的推荐列表对StackOverflow来说不太合适,但我发现这里有一个有助于获得基本概念:http://aaronhardy.com/javascript/javascript-architecture-requirejs-dependency-management/

requirejs文档的这一部分描述了感叹号在domReady上下文中的含义:http://requirejs.org/docs/api.html#pageload

由于DOM就绪是一种常见的应用程序需求,理想情况下可以避免上面API中的嵌套函数。domReady模块还实现了Loader插件API,因此您可以使用Loader插件语法(注意domReady依赖项中的!)来强制require()回调函数等待DOM就绪后再执行。