我在老师的笔记中发现了一段代码,我不明白。 重点是找到" 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>
答案 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
。
这个程序的运行方式还不是很清楚,但它实际上修改了一个变量并返回了更多的函数来模拟一些逻辑,这些逻辑根据你调用函数的方式以不同的方式修改变量。