为什么我从两个函数中得到两个不同的结果;利用闭包似乎没有什么不同
Why am I getting two different results from two functions that don't seem different at all taking advantage of closures?
我已经将数字0分配给函数外的一个变量。我使用这个变量是为了利用闭包,因为我还创建了一个简单的函数,它只返回递增的变量,目的是跟踪我调用该函数的次数。我调用该函数5次,最后将调用的函数传递给alert函数。令人困惑的是,如果我递增变量,然后返回变量,我得到的警告消息是"6",而不是"5",这是我调用函数的次数。然而,如果我同时递增变量并返回,这意味着变量递增是return语句的一部分,我在警报消息中得到了调用函数的正确次数。为什么我得到了不同的结果?我用作计数器的函数之外的变量被赋予了数字0。创建全局执行上下文并保存此变量,对吗?除此之外,我的5个调用还创建了5个执行上下文,每次,新的增量变量都会在内存中存在,并为下一个增量调用保留。"6"是从哪里来的?这是我的代码,它产生6作为函数被调用的次数:
var i = 0;
function add() {
i++;
return i;
}
add();
add();
add();
add();
add();
alert(add());
只需这样做:
function add() {
return i++;
}
我得到了正确号码的提醒。
在第一种情况下,值在递增后返回,在第二种情况下值在递增前返回
尝试alert ( i );
而不是alert( add() );
,您将获得相同的值
这与递增流有关。
预增量(++i)将i
的值加1,然后返回i
,相反,i++返回i,然后再加1。在第一种情况下,您在单独的语句中递增值,因此递增前或后不起任何作用,在第二种情况下递增前或递增后起作用,因为函数首先返回i
,而不是递增。
如果您添加的功能是下一个,您将得到相同的结果
function add(){
return ++i;
}
return i++;
表示先返回i,然后进行增量。
顺便说一下,
return ++i;
意味着您先进行增量,然后返回i。
当您调用alert(add())时,您将再次调用add(),并且由于i的当前值为5,因此i的值将增加到6,因为您已经调用add 5次了。如果在警报中的add()调用之前打印i,它仍然是5,但一旦在警报中调用add(),它就会变成6,因为您正在调用方法调用。
var i = 0;
function add() {
i++;
return i;
}
add();
add();
add();
add();
add();
// alert(i +' '+ add()); //5 6
alert(add() +' '+ i); //6 6
- 将循环中的两个文本框相乘,并在第三个文本框上显示结果
- Jquery - 将我的两个类相乘没有结果
- 根据两个异步函数调用的结果执行
- 1行代码(console.log),代码中的两个位置=两个结果差异
- 添加两个数字,并使用Javascript在文本框中显示结果
- 在模板帮助程序中连接两个查询的结果
- 在比较和匹配两个对象列表时,防止结果列表中重复
- 如何使用 Ajax 比较来自两个不同来源的结果
- 当我尝试两个 DOM 中的 get 元素时,HTML 和 Xpath 结果未定义
- 如果我有两个选项的代码,单选按钮的结果将无法正常工作
- 了解两个代码解决方案之间的结果差异
- 如何检查两个单独函数的执行结果
- Jquery 优化表的结果:两个或多个逻辑语句
- 2 可变结果不能有两个
- 将 JavaScript 结果打印到两个 DIV 而不是输入中
- Sails-mongo在两个日期之间得到结果
- 不同的结果是减去这两个值
- JavaScript原生Promise对两个结果执行回调
- Backbone JS-Model返回两个结果,而不是一个
- 如何一次用两个结果进行两个验证