2016-02-04 41 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" 
    }); 
}); 

我不明白,你能怎麼辦?「新地圖」當MAP功能(圖)參數。爲了能夠使用new,Map必須是一個類型,並且我沒有看到類型是其他語言中的參數。

回答

4

關於Javascript的有趣之處在於沒有類。 Javascript中類的等價物只是一種特殊的功能。其實,忘記前一句中的「特殊」(只是想減輕打擊)。 任何功能可以「充當一個類」,並與the new operator實例化(雖然它真的只有當該功能分配的東西this所以生成的對象獲得公共方法和屬性時纔有用)。

而Javascript中的函數是一等公民。函數可以分配給變量,函數可以作爲參數傳遞給其他函數。這使得將函數傳遞給另一個函數並使其他函數用new實例化它是完全合法的。

是的,這確實是一個非常奇怪的概念,用來包裝一個用於面向類的編程語言的頭部。但一旦你理解它,它變得令人驚訝的直覺。

那麼,在你的問題發佈的代碼的情況是這樣的:

  1. 當執行require,它卡列斯匿名函數傳遞一個 功能,它
  2. 匿名函數assignes那 函數爲局部變量Map
  3. 然後匿名函數創建該類的一個實例 函數。
  4. 實例分配給全局變量map
+0

好吧,如果將函數中的代碼放在變量賦值中,會發生什麼?當我做新地圖時它會執行嗎? – Math

+0

@Math把代碼放在* what *函數中? – Philipp

+0

我將採用Apple功能下面的suvroc例子。如果有代碼修改頁面,或者我們假設有一個警報,那麼當我將執行var apple = new Apple()時,警報會顯示嗎? – Math

4

爲了能夠使用新的,則地圖必須是一個類型

號爲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參數是一個定義對象的函數