簡體   English   中英

Javascript定義函數

[英]Javascript defining functions

我一直在和可汗學院學習Javascript。 我在看: http//www.khanacademy.org/cs/speed-circles/964929070

有一行顯示“var draw = function(){...}”是否定義了一個名為draw的函數? 或者是變量繪制調用一些函數(我沒有看到定義)?

謝謝!

是的,函數表達式被分配給名為draw的變量。 你甚至可以打電話給它:

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

draw(); // 'xyz'

在JavaScript中,函數是對象,就像數組和邏輯對象一樣。 正如您可能已經發現的那樣,這些對象可以分配給多個變量,但只要您更改其中一個變量,它們就會發生變化。 那是因為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有一些事情, too:分配對變量的引用。 該功能不會被懸掛:

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的最重要原因必須是動態地重新定義功能

請注意,在processing.js中(由此Khan學院演示使用),每個幀參考文檔都會自動調用函數繪制。

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

汗學院有一個關於這個使用平局功能的教程在這里

function draw(){return“Sample”; };

var draw = function(){return“Sample”; };

是一樣的意思。

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

然后,他將其綁定到名稱繪制以供將來參考。

他也可以寫

function draw() {
    ...
}

出於這些目的,它們是等效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM