parens如何运作?

时间:2015-05-05 19:44:37

标签: javascript function

我在老师的笔记中发现了一段代码,我不明白。 重点是找到" pass"的值。该函数将返回TRUE。 您能否回答下面的问题(评论),以便了解这是如何运作的?

<script type="text/javascript">

function findPassword(pass)
{
    var b = 1337

//How is this function returning "min" (without the parens?)

function add(x){
    b += 84
    return min
}

//Same question as above...for "mod" - how is this compiling? 

function min(x){
    b -= 123
    return mod
}

function div(x){
    b /= 3
    return min
}

function mod(x){
    b = b+5+(b%3)
    return add
}

//what is the purpose of "fn" if it is not used at all?

var fn = function ()
{
    b += 34
    return div
}

//WHAT is happening here? "() () ()"

    (function (){
        b /= 3
        return mod
    })()()()

    if(pass == b*b) { 
        return true;
    } else {
        alert("Wrong password !")
        return false;
    }
}
</script>

3 个答案:

答案 0 :(得分:5)

所以看看这个:

(function (){
    b /= 3
    return mod
})()()()

你有这个:

function (){
    b /= 3
    return mod
}

这是一个功能。您将其包装在括号中,然后使用()调用它,这称为立即调用的函数表达式(IIFE)。

那又回归了什么?它返回mod,这是一个函数,因此下一个()将调用该函数。

mod返回什么:

function mod(x){
    b = b+5+(b%3)
    return add
}

它返回函数add,您使用()再次调用它。函数add恰好返回函数min,但由于我们没有(),我们不会调用它,所以它基本上被抛弃了。

现在,这并不是说这是构建代码的良好方式,因为它不是。

至于实际使findPassword返回true的值是多少?好吧,你可以关注每个函数中b的情况。

......或者,你可以在IIFE之后立即坚持console.log(b);来看它的价值。您需要的pass值将是该数字的平方。

答案 1 :(得分:4)

仅仅因为没有人指出此示例中函数$output的用途是什么:

乍一看,似乎你有一个匿名函数自动执行,并通过这样做启动一个执行链,但是,封装匿名函数,fn实际上是只有代码中的函数才能执行,这是因为add之前的声明缺少分号

fn

由于缺少分号,封装了此函数声明之后的匿名函数的括号实际上正在执行var fn = function () { b += 34 return div } // <- missing semicolon. // Because of this, the `var` statement doesn't stop in here. ,并将匿名函数作为参数传递给它(fn正在执行这个论点没什么。 所以,实际上,代码看起来像这样:

fn

与此基本相同:

var fn = function ()
{
    console.log(arguments[0]); // Logs the anonymous function
    b += 34
    return div
}(function (){
  b /= 3
  return mod
})()()()
// The parentheses () mean 'execute' this.
// If they are chained, they execute what the previous
// function returned.
// It is possible to do that when, like in this code, the functions
// return a function reference (meaning, the name of a function).

执行链是:

var fn = function () {
    b += 34/= 3
    return div
}( /* Executing fn... */ )( /* div */ )( /* min */ )( /* mod */ )

// fn ends up containing a reference to add, because mod returns that,
// but add is never called.

console.log(fn === add); // true

因此,要获得密码,请执行以下操作:

fn => div => min => mod

当然,你也可以var b = 1337; b += 34; b /= 3; b -= 123; b = b + 5 + (b%3); // b === 340 // password is b^2: 340 * 340 = 115600 b ,但那是什么感觉?

答案 2 :(得分:0)

按照return语句,您会看到它们是函数,因此将()添加到该返回值将对其进行评估。

第一组parens在它之前执行函数。这将返回mod这是一个函数。它由第二个parens执行。这个(mod)返回add,这又是一个函数。所以最后一组parens执行add。最后,返回min

这个程序的运行方式还不是很清楚,但它实际上修改了一个变量并返回了更多的函数来模拟一些逻辑,这些逻辑根据你调用函数的方式以不同的方式修改变量。