2013-01-24 66 views

回答

4

是的,函數表達式被分配給名爲draw的變量。你甚至可以稱之爲:

var draw = function() { 
    console.log('xyz'); 
}; 

draw(); // 'xyz' 
-1

function() { ... }創建一個函數值。也就是說,可以像JavaScript中的數字或其他任何對象一樣輕鬆地傳遞。

然後他將它綁定到名稱繪製以供將來參考。

他可能也已經寫

function draw() { 
    ... 
} 

爲了這些目的,他們是等價的。

+0

在99.999%的情況下,一個數字不是一個對象,而是一個文字 - 就像大多數理智的人寫的一樣。var someString ='一個字符串文字';',而不是'var stringObject = new String('一個字符串對象' )'。另外,編寫一個匿名函數不同於像你一樣聲明一個函數:它是一個表達式,所以在這種情況下'draw'不會被掛起 –

0

請注意,在processing.js(此Khan學院演示中使用)中,函數draw會自動調用每幀reference doc

這段代碼覆蓋了繪製的默認(空)實現,以便每幀調用給定的代碼。

汗學院有一個關於這種使用繪圖功能的教程here

1

在JavaScript中,函數是對象,就像數組和-logically-對象一樣。正如你可能已經發現這些對象可以被分配給多個變量,但是隻要你改變這些變量中的一個,它們都會改變。這是因爲JS總是由值分配,但可變從不直接分配的對象:它分配到對象的引用:

var obj = {iam: 'an object'}; 
var reassign = obj; 
console.log(obj);//shows object 
console.log(reassign);//surprize, shows the same thing 
reassign.bar = 'foobar'; 
console.log(obj.bar);//logs foobar, the variable obj has gained the same property, because it is the same object. 

這同樣適用於功能,作爲對象,則可以分配給變量/屬性所有的地方,但它仍然會是相同的對象/功能:

var foo = function() 
{ 
    console.log('I am an object'); 
}; 
var second = foo; 
second();//logs I am an object 
console.log(second === foo);//logs true, because they both reference the same thing 

那麼,爲什麼你可能會問是匿名功能被分配給一個變量,而不是僅僅聲明功能如你所料?好:

function foo(){} 

懸掛,運行任何代碼,JS將所有函數的聲明和變量聲明範圍內的最頂端之前,但在你的情況,你不能簡單地定義一個函數,或者聲明一個變量:JS也必須某事:分配一個變量的引用。該功能不會被掛起:

var foo = function() 
{ 
    console.log('foo'); 
}; 
foo();//logs foo 
foo = function() 
{ 
    console.log('bar'); 
}; 
foo();//logs bar now 

如果foo在賦值之前未定義,則會出現錯誤。如果任何代碼在上面的代碼之前,JS 提升foo的變量聲明,但它的值仍然是未定義的。

有什麼意義?當您開始使用閉包播放時,或者如果您需要功能不同時,這取決於分支(if (x){ foo = functionX} else { foo = functionY;}),這將證明是有用的。這些只是你想避免範圍提升的兩個原因...但所有ATM的最重要原因必須是redefining a function on the fly

0

function draw(){return「Sample」; };

var draw = function(){return「Sample」; };

是相同的意思。