繁体   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