Javascript,在函数中传递类型作为参数

时间:2016-02-04 15:32:06

标签: javascript

我目前正在学习Javascript,我注意到一些对我来说没有多大意义的东西。

在ArcGIS网站上的示例中,有一段代码

var map
require(["esri/map", "dojo/domReady!"], function(Map) {
  map = new Map("mapDiv", {
    center: [-56.049, 38.485],
    zoom: 3,
    basemap: "streets"
  });
});

我不知道你怎么做"新地图"当Map是函数的参数(Map)时。为了能够使用new,那么Map必须是一个类型,我还没有看到一个类型是其他语言的参数。

3 个答案:

答案 0 :(得分:7)

关于Javascript的有趣之处在于确实没有课程。 Javascript中的等价物只是一种特殊的功能。实际上,忘记前一句中的“特殊”(只是想软化打击)。 任何函数都可以“作为一个类”并使用the new operator进行实例化(虽然它只在该函数将内容分配给this时才有用,因此生成的对象可以获得公共方法和属性)。

Javascript中的函数是一等公民。函数可以分配给变量,函数可以作为参数传递给其他函数。这使得将函数传递给另一个函数然后让其他函数用new实例化它是完全合法的。

是的,这确实是一个非常奇怪的概念,用于包含面向类的编程语言。但是一旦你明白它就会变得非常直观。

那么你在问题中发布的代码会发生什么:

  1. 执行require时,会调用将函数传递给它的匿名函数
  2. 匿名函数将 class 函数分配给局部变量Map
  3. 匿名函数然后创建该函数的实例。
  4. 将实例分配给全局变量map

答案 1 :(得分:5)

  

为了能够使用new,那么Map必须是一个类型

没有。要使new生效,Map必须是功能

函数是JavaScript中的第一类对象,可以像任何其他数据一样处理(分配给变量,作为函数参数传递等)。

function One() {
  this.foo = 1;
}

function myCallingThing(arg) {
  alert(new arg().foo + 1);
}

var Two = One;

var instance = new Two;

alert(instance.foo);

myCallingThing(Two);

这不是JavaScript独有的。

#!/usr/bin/perl

use strict;
use warnings;
use v5.10;

sub example {
    say "Hello";
}

sub callme {
    my $var = shift;
    $var->();
}

callme(\&example);

#!/usr/bin/python

def example():
    print "Hello\n"

def callme(arg):
    arg();

callme(example)

答案 2 :(得分:3)

通过定义函数,您可以创建类

之类的东西
function Apple (type) {
    this.type = type;
    this.color = "red";
    this.getInfo = getAppleInfo;
}

然后你可以创建你的函数/类的新实例

var apple = new Apple('lobo');

因此,您的Map参数是定义对象的函数