3

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

有一行写着“var draw = function() {...}”他是在定义一个名为 draw 的函数吗?还是变量 draw 调用了某个函数(我没有看到定义)?

谢谢!

4

5 回答 5

4

是的,函数表达式被分配给名为 的变量draw。你甚至可以这样称呼它:

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

draw(); // 'xyz'
于 2013-01-24T22:36:05.270 回答
1

在 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 必须一些事情,也:分配对变量的引用。该功能不会被提升:

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 中最重要的原因必须是动态重新定义功能

于 2013-01-24T23:11:38.590 回答
0

请注意,在 processing.js 中(正如这个可汗学院演示所使用的那样),函数 draw 会自动调用每个帧引用 doc

这段代码覆盖了 draw 的默认(空)实现,以便每一帧都调用给定的代码。

可汗学院在这里有一个关于这种使用绘图功能的教程。

于 2013-01-24T22:38:44.460 回答
0

函数绘制(){返回“样本”;};

var draw = function(){ return "示例"; };

是相同的意思。

于 2015-02-02T16:00:39.223 回答
-1

function () { ... }创建一个函数值。也就是说,可以像数字或 javascript 中的任何其他对象一样容易地传递的东西。

然后,他将其绑定到名称 draw 以供将来参考。

他也可以写

function draw() {
    ...
}

出于这些目的,它们是等效的。

于 2013-01-24T22:36:18.817 回答