我一直在和可汗学院学习Javascript。我在看:http://www.khanacademy.org/cs/speed-circles/964929070
有一行显示“var draw = function(){...}”是否定义了一个名为draw的函数?或者是变量draw调用一些函数(我没看到定义)?
谢谢!
答案 0 :(得分:4)
是的,正在为名为draw
的变量分配函数表达式。你甚至可以打电话给它:
var draw = function() {
console.log('xyz');
};
draw(); // 'xyz'
答案 1 :(得分: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的最重要原因必须是redefining a function on the fly
答案 2 :(得分:0)
请注意,在processing.js中(由此Khan学院演示使用),每个帧reference doc自动调用函数绘制。
这段代码会覆盖draw的默认(空)实现,以便每帧调用给定的代码。
Khan学院有关于使用绘制函数here的教程。
答案 3 :(得分:0)
function draw(){return“Sample”; };
var draw = function(){return“Sample”; };
是相同的意思。
答案 4 :(得分:-1)
function () { ... }
创建一个函数值。也就是说,可以像javascript中的数字或任何其他对象一样轻松传递。
然后他将其绑定到名称draw以供将来参考。
他也可以写
function draw() {
...
}
出于这些目的,它们是等效的。