Javascript一行多个声明并学习Javascript

Javascript一行多个声明并学习Javascript,javascript,coffeescript,Javascript,Coffeescript,我在Java中工作,我所有的教育都是在Java中,我试图弄清楚这对Atom文本编辑器有什么贡献。这是Coffeescript.org上的一个代码示例: race = function() { var runners, winner; winner = arguments[0], runners = 2 <= arguments.length ? slice.call(arguments, 1) : []; return print(winner, runners); }; i

我在Java中工作,我所有的教育都是在Java中,我试图弄清楚这对Atom文本编辑器有什么贡献。这是Coffeescript.org上的一个代码示例:

race = function() {
  var runners, winner;
  winner = arguments[0], runners = 2 <= arguments.length ? slice.call(arguments, 1) : [];
  return print(winner, runners);
};

if (typeof elvis !== "undefined" && elvis !== null) {
  alert("I knew it!");
}
race=function(){
运动员,获胜者;

winner=arguments[0],runners=2Nick,欢迎来到Stack Overflow,因为这是您在任何论坛上的第一个问题。Stack Overflow(SO)主要是一个问答网站,而不是一个真正的论坛。因此,第一点建议,你已经问了大约3个问题,如果你只问一个,最好阅读这个网站上的“我该如何问一个好问题”页面,以获取更多建议。第二,任何可能引起争论或可能有许多观点和意见的问题通常都是本网站仅用于问答(非讨论)

所以,关于JavaScript问题,我可以帮助你>我对CoffeeScript一无所知,除了它是JavaScript的一个更面向对象的包装器。我个人说,更好地学习JavaScript。特别是随着新的JavaScript标准(ECMAScript 6)的推出,希望它能让像CoffeeScript这样的东西不再需要(不过我不知道)

在JavaScript中调用函数时,除了括号中定义的参数外,每个函数都会得到另外两个参数,
this
arguments
。忽略
this
(除了说明调用函数的对象上下文或全局对象之外),参数是一个类似数组的对象,它包含传递到函数中的所有参数

在您的例子中,函数
race
根本没有定义任何参数(因此空括号
()
),因此函数使用的是
参数
参数,每个函数默认使用的参数。
参数
非常有用,因为它意味着您可以用JavaScript编写一个函数,该函数可以使用您提供给它的任何数量的参数

现在race函数也有很多缩短的语法,因此我将重新编写一些扩展的语法,这可能有助于理解:

race = function () {
    var winner; //Declare two variables, winner and runners, but they are set to undefined
    var runners;

    winner = arguments[0]; //Assign winner to the first argument

    if (arguments.length >= 2) { //If there is 2 or more arguments passed in
        runners = slice.call(arguments, 1); //trim off the first argument (that was Arguments[0], the winner), and assign whats left to runners
    }
    else {
        runners = []; //Set runners to an empty array
    }
    return print(winner, runners); //Call print
};
现在我觉得上面的函数片不正确,它一定在其他地方的作用域中。通常是
Array.prototype.slice.call(arguments,1);
,因为这里的目的是在类似数组的对象上使用数组函数(
arguments
)使用array.prototype和调用以不同的上下文执行函数。如果我失去了您,请原谅,但是如果您想了解更多,请查看JavaScript中的JavaScript原型继承和函数重用

现在慢慢地放回缩短的语法。声明变量可以用一个
var
和逗号来完成,所以:

var winner;
var runners;
可能只是

var winner,
    runners;

//Or all on one line

var winner, runners;
当然,你可以包括声明和作业

var winner = arguments[0],
 runners = 2 <= arguments.length ? slice.call(arguments, 1) : [];
现在,
null
的意义是什么,我倾向于使用它作为nothing的用户版本。JavaScript本身从不将任何内容设置为
null
,所以有时我在代码中这样做,以指示nothing值,但我不希望它像实际定义的那样是
未定义的
,只是nothing

另外,
undefined
null
在JavaScripts falsey规则中解析为false,这样最后一行就可以

if (elvis) {
    alert("I knew it!");
}
并且可能是相同的(唯一的问题可能是空字符串
,因为它在JavaScript中也会解析为false,这可能不是您所追求的行为) 无论如何,如果你想知道更多,只需谷歌JavaScript的真假


最后,正如我前面所说,我对Coffeescript了解不多,我认为你关于开放源码的问题会导致更多的讨论问题和观点,这并不是一个正确的地方。你发布的代码是javascript。请参阅OJay的答案了解它的工作原理。
在coffeescript中,使用以下各项会更简单:

或在ES6中:

race = function(winner, runners...) {
  console.log(winner, runners);
}
对于第二个块,您只需使用in-coffeescript:

alert "I knew it!" if elvis?

非常好的回答。非常感谢你的介绍。我会尽我最大的努力遵循你概述的期望和标准。此外,你的回答非常有帮助,平易近人。希望我能给你更好的道具!好的,谢谢。最后一部分特别有帮助!
race = function(winner, runners...) {
  console.log(winner, runners);
}
alert "I knew it!" if elvis?