2016-02-04 3 views
2

В настоящее время я изучаю 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" 
    }); 
}); 

Я не понимаю, как вы можете сделать «новую карту», ​​когда карта является параметром функции (Карта). Чтобы иметь возможность использовать new, тогда Map должен быть типом, и я не видел, чтобы тип был параметром на других языках.

ответ

4

Самое смешное в Javascript, что на самом деле классов нет. Эквивалент класса в Javascript - это просто особый вид функции. Собственно, забудьте о «особом» в предыдущем предложении (просто хотел смягчить удар). Любая функция может «действовать как класс» и создаваться с помощью the new operator (хотя она действительно полезна только тогда, когда эта функция назначает материал this, чтобы генерируемый объект получал общедоступные методы и атрибуты).

И функции в Javascript являются первоклассными гражданами. Функции могут быть назначены переменным, а функции могут передаваться как аргументы другим функциям. Это делает законным передавать функцию в другую функцию, а затем эту функцию выполняет экземпляр с new.

Да, это действительно очень странная концепция, чтобы обернуть голову вокруг, которая используется для классов-ориентированных языков программирования. Но это становится удивительно интуитивным, как только вы это понимаете.

Так что же происходит в коде, публикуемой в вопросе заключается в следующих:

  1. Когда require выполняются, он Кальесы анонимной функции, проходящей в функцию класса к нему
  2. анонимных функции assignes что класс функция для локальной переменной Map
  3. анонимная функция затем создает экземпляр этого класса .
  4. экземпляр присваивается глобальной переменной map
+0

Хорошо, что происходит, если положить код в функцию, а не просто назначения переменных? Будет ли он выполняться, когда я буду делать новую карту? – Math

+0

@Math положить код в * какой * функция? – Philipp

+0

Я возьму пример suvroc ниже с функцией Apple. Если есть код, который изменяет страницу, или, скажем, предупреждение, появится ли предупреждение, когда я сделаю var apple = new Apple()? – Math

4

Чтобы иметь возможность использовать новые, то карта должна быть типа

No. Для 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) 
+0

Хорошо, я думаю, я понимаю. Пример python выглядит скорее как указатель на функцию. Я знаком с этим, но использование функции как класса (для использования собственных переменных) для меня нова. Благодаря! – Math

3

Определяя функции вы можете создать что-то вроде класса

function Apple (type) { 
    this.type = type; 
    this.color = "red"; 
    this.getInfo = getAppleInfo; 
} 

Затем вы можете создать новый экземпляр вашей функции/класс

var apple = new Apple('lobo'); 

Так ваш Map - это функция, которая определяет объекты

Смежные вопросы