了解http://javascriptissexy.com/javascript-is-super-sexy/中的示例代码

时间:2013-12-03 08:06:29

标签: javascript

我对如何遵循此代码的流程感到困惑。 很明显,我目前是JavaScript的初学者。

据我所知: 前两行声明了2个全局变量,“性感”和“JavaScript”,但没有定义它们。

第3行:定义“性感”函数,该函数采用零参数。

第4行:调用性感时会发生什么。我发现这一行的语法令人困惑。我把它看成是这样的:如果“丑陋.Rails很热。”是真的,然后通过“性感!”到sexy.sexy。否则,传递“没有Python”。 to sexy.sexy。

第6行:定义名为Javascript的对象及其内容。

第7行:关键“性感”:值=变量性感,

第8行:键“是”:value = function“sexAppeal”

第9行:传递给函数sexAppeal的参数为true。

第10行:如果arguments [0]为false,则console.log“JavaScript is”+ this this.sexy()的计算结果为。

最后一行:使用零参数调用JavaScript对象内的“is”函数。

我不太确定如何在最后一行的函数调用中跟踪这一切,直到它调试最终输出为止。

任何旁白都会受到高度赞赏。谢谢!

var sexy, 
    JavaScript;
function sexy() {
    return this.sexy ? ("ugly. Rails is HOT.","Sexy!") : "no Python.";
}
JavaScript = { 
    sexy:sexy, 
    is:function (sexAppeal) {
        sexAppeal = true;
        if (!arguments[0]) {
            console.log("JavaScript is " + this.sexy());
        }
    }
};
JavaScript.is();

2 个答案:

答案 0 :(得分:3)

评论中的叙述:

var sexy,  // declare a variable named `sexy`
    JavaScript; // and one named `JavaScript`
function sexy() { // declare a function named `sexy` which overrides the `sexy` variable
    return this.sexy ? // ternary operator condition is that `this.sexy` have a truthy value
           ("ugly. Rails is HOT.","Sexy!") : // comma operator, equivalent to 'Sexy!'
           "no Python."; // falsy result
}
JavaScript = { // initialize JavaScript to an object (with two properties)
    sexy:sexy, // property `sexy` references the function above
    is:function (sexAppeal) { // property `is` references this unnamed function defined right here
        // inside the function the first argument can be referenced as `sexAppeal`
        sexAppeal = true; // override the value of `sexAppeal` to be `true`
        if (!arguments[0]) { // `arguments[0]` is the original value of the first argument
            console.log("JavaScript is " + this.sexy()); // prints `Javascript is Sexy!`
        }
    }
};
JavaScript.is(); // call the unnamed (`is`) function above with `this === JavaScript` and `sexAppeal === undefined`

额外:三元条件为真,因为this.sexy === JavaScript.sexy是一个函数(函数是所有求值为true的对象)。

答案 1 :(得分:2)

我认为你最大的问题是:

function sexy() {
    return this.sexy ? ("ugly. Rails is HOT.","Sexy!") : "no Python.";
}

确实定义了全局函数sexy。让我们稍微改变一下这段代码,这样就会有意义了。

JavaScript = { 
    sexy: function() {
        return this.sexy ? ("ugly. Rails is HOT.","Sexy!") : "no Python.";
    },
    is:function (sexAppeal) {
        sexAppeal = true;
        if (!arguments[0]) {
            console.log("JavaScript is " + this.sexy());
        }
    }
};

一切都好。虽然现在该函数不是全局函数,但它向我们展示了它的作用 - 如果在此对象中定义this.sexy(它是),则返回("ugly. Rails is HOT.","Sexy!") - 由于"Sexy!"而归为, 0,1运算符(在控制台1,0a,bJavascript中尝试)。

使用默认语法,我们可以创建任意数量的对象(和“类”)并使函数性能访问其属性。

现在is块中发生了什么。

首先是Isis是保留字,不应该使用 - 虽然它可以在Chrome中使用,但它不会在IE中(我很确定它不能在IE8中使用,此刻我的本地IE更新自己,所以不能真正测试它。)(看documentation无法确认is确实是一个保留关键字,虽然我很确定IE抱怨它也许是我的老年痴呆症。 var a = function() { arguments[0] = 'a'; console.log(arguments[0]); } a(); 函数的有趣之处在于它表明JS中的参数可以重载。含义:

{{1}}

将输出'a';

你的思维过程是正确的 - 希望我对这些内容的解释是有道理的