我一直在學習與汗學院的Javascript。我在看:http://www.khanacademy.org/cs/speed-circles/964929070Javascript定義函數
有一行讀取「var draw = function(){...}」是他定義了一個叫做draw的函數嗎?或者是調用一些函數的變量繪圖(我沒有看到定義)?
謝謝!
我一直在學習與汗學院的Javascript。我在看:http://www.khanacademy.org/cs/speed-circles/964929070Javascript定義函數
有一行讀取「var draw = function(){...}」是他定義了一個叫做draw的函數嗎?或者是調用一些函數的變量繪圖(我沒有看到定義)?
謝謝!
是的,函數表達式被分配給名爲draw
的變量。你甚至可以稱之爲:
var draw = function() {
console.log('xyz');
};
draw(); // 'xyz'
function() { ... }
創建一個函數值。也就是說,可以像JavaScript中的數字或其他任何對象一樣輕鬆地傳遞。
然後他將它綁定到名稱繪製以供將來參考。
他可能也已經寫
function draw() {
...
}
爲了這些目的,他們是等價的。
在99.999%的情況下,一個數字不是一個對象,而是一個文字 - 就像大多數理智的人寫的一樣。var someString ='一個字符串文字';',而不是'var stringObject = new String('一個字符串對象' )'。另外,編寫一個匿名函數不同於像你一樣聲明一個函數:它是一個表達式,所以在這種情況下'draw'不會被掛起 –
請注意,在processing.js(此Khan學院演示中使用)中,函數draw會自動調用每幀reference doc。
這段代碼覆蓋了繪製的默認(空)實現,以便每幀調用給定的代碼。
汗學院有一個關於這種使用繪圖功能的教程here。
在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
function draw(){return「Sample」; };
var draw = function(){return「Sample」; };
是相同的意思。
更多信息請訪問:https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Functions#Defining_functions。 – VisioN