Javascript定义函数

Javascript定义函数,javascript,function,variables,Javascript,Function,Variables,我一直在汗学院学习Javascript。我在看: 有一行写着“var draw=function(){…}”,他在定义一个名为draw的函数吗?或者变量draw正在调用某个函数(我没有看到定义的函数) 谢谢 是的,正在为名为draw的变量指定函数表达式。你甚至可以称之为: var draw = function() { console.log('xyz'); }; draw(); // 'xyz' function(){…}创建函数值。也就是说,可以像数字或javascript中的任

我一直在汗学院学习Javascript。我在看:

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


谢谢

是的,正在为名为
draw
的变量指定函数表达式。你甚至可以称之为:

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

draw(); // 'xyz'
function(){…}
创建函数值。也就是说,可以像数字或javascript中的任何其他对象一样轻松地传递某些内容

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

他本可以写信的

function draw() {
    ...
}

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

请注意,在processing.js(本演示使用的)中,每一帧都会自动调用函数draw

此代码位覆盖draw的默认(空)实现,以便每帧调用给定代码


Khan academy有一个关于draw函数使用的教程。

在JavaScript中,函数是对象,就像数组一样,从逻辑上讲,对象也是对象。正如您可能已经发现的那样,这些对象可以分配给许多变量,但只要您更改其中一个变量,它们都会更改。这是因为JS总是按值赋值,但变量从不直接赋值给对象:它被赋值给对象引用:

这同样适用于函数,作为对象,可以将变量/属性分配到所有位置,但仍然是相同的对象/函数:

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最重要的原因是

函数draw(){return“Sample”;}

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


相同的含义。

这里的更多信息:。在99.999%的情况下,数字不是对象,而是文字-就像大多数理智的人写的
var someString='A string literal',而不是
var stringObject=新字符串(“字符串对象”)
。此外,编写匿名函数与像您这样声明函数不同:它是一个表达式,因此在本例中,
draw
不会被提升
var foo = function()
{
    console.log('foo');
};
foo();//logs foo
foo = function()
{
    console.log('bar');
};
foo();//logs bar now