Javascript 函数作用域变量是否不可写
为什么计数器变量在第一次迭代后不递增?输出总是Javascript 函数作用域变量是否不可写,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,为什么计数器变量在第一次迭代后不递增?输出总是1add函数返回在函数add中定义的变量计数器。变量计数器的范围是函数的局部范围,这意味着每次调用函数时,它都会创建一个新变量计数器,然后初始化为零,然后递增计数器 如果您正在寻找计数器实现,那么每次都需要引用相同的计数器变量并递增该变量。这可以通过使用闭包来实现 示例:在下面的示例中,有两个函数,一个嵌套在另一个函数中。内部函数维护对外部函数环境的引用,在本例中,外部函数环境包含计数器变量。因此,即使在控件移出函数add之后,内部函数仍保持对计数器
1
add
函数返回在函数add
中定义的变量计数器。变量计数器
的范围是函数的局部范围,这意味着每次调用函数时,它都会创建一个新变量计数器
,然后初始化为零,然后递增计数器
如果您正在寻找计数器实现,那么每次都需要引用相同的计数器变量并递增该变量。这可以通过使用闭包来实现
示例:在下面的示例中,有两个函数,一个嵌套在另一个函数中。内部函数维护对外部函数环境的引用,在本例中,外部函数环境包含计数器
变量。因此,即使在控件移出函数add之后,内部函数仍保持对计数器
变量的引用
var add=(函数(){
var计数器=0;
返回函数(){
返回++计数器;
}
})();
文件
.querySelector(“#btn”)
.addEventListener('单击',函数()){
document.querySelector('#output').textContent=add();
});代码>
0
Increment
函数add
返回在函数add
中定义的变量计数器。变量计数器
的范围是函数的局部范围,这意味着每次调用函数时,它都会创建一个新变量计数器
,然后初始化为零,然后递增计数器
如果您正在寻找计数器实现,那么每次都需要引用相同的计数器变量并递增该变量。这可以通过使用闭包来实现
示例:在下面的示例中,有两个函数,一个嵌套在另一个函数中。内部函数维护对外部函数环境的引用,在本例中,外部函数环境包含计数器
变量。因此,即使在控件移出函数add之后,内部函数仍保持对计数器
变量的引用
var add=(函数(){
var计数器=0;
返回函数(){
返回++计数器;
}
})();
文件
.querySelector(“#btn”)
.addEventListener('单击',函数()){
document.querySelector('#output').textContent=add();
});代码>
0
增量
您可以将计数器设为全局变量,然后调用add函数:
function add() {
var counter = 0;
counter += 1;
return counter
}
您可以将计数器设为全局变量,然后调用add函数:
function add() {
var counter = 0;
counter += 1;
return counter
}
这是一个范围问题。换成
function add(){
counter = counter + 1;
}
或者,如果希望能够执行add(),请使用嵌套函数
let counter = 0;
function add() {
counter += 1;
return counter
}
这是一个范围问题。换成
function add(){
counter = counter + 1;
}
或者,如果希望能够执行add(),请使用嵌套函数
let counter = 0;
function add() {
counter += 1;
return counter
}
因为您每次都在0初始化它。。。代码的作用与您认为的完全相同。您在中声明了一个新的计数器
变量,并始终将其设置为0。每次调用此函数时,它都会重置为0并递增1,然后返回1为什么变量计数器的新状态在用javascript重新分配variableOP(一台无用的机器)后未保存:),因为每次都在0初始化它。。。代码的作用与您认为的完全相同。您在中声明了一个新的计数器
变量,并始终将其设置为0。每次调用此函数时,它都会重置为0并递增1,然后返回1为什么变量计数器的新状态在重新分配variableOP后未保存在javascript中一台无用的机器上:)@JeremyThille这是一个闭包,正如Agalo所说。闭包利用父作用域中声明的变量。var计数器;函数add(){counter+=1;return counter;}
和(函数(){var counter=0;返回函数add(){counter+=1;return counter;};};}())
为什么上面的代码在用作函数定义而不是表达式时不起作用,我也不清楚。。通过上面的解释,是不是一旦函数被声明,它的所有变量赋值就不能通过调用true来更改?我建议您阅读更多关于javascript中作用域工作原理的内容。即使是函数表达式,代码也无法工作。如果变量是在函数中声明的,它每次都会创建一个新变量。在我答案中的代码中,add()
函数返回另一个函数,即内部函数。因此,当我们再次调用add()
时,函数不会执行var counter=0相反,它执行返回的函数,该函数包含代码return++计数器代码>。“我希望它能带来更多的清晰。”杰里米希尔说,正如阿加洛所说,这是一个终结。闭包利用父作用域中声明的变量。var计数器;函数add(){counter+=1;return counter;}
和(函数(){var counter=0;返回函数add(){counter+=1;return counter;};};}())
为什么上面的代码在用作函数定义而不是表达式时不起作用,我也不清楚。。通过上面的解释,是不是一旦函数被声明,它的所有变量赋值就不能通过调用true来更改?我建议您阅读更多关于javascript中作用域工作原理的内容。即使是函数表达式,代码也无法工作。如果变量是在函数中声明的,它每次都会创建一个新变量。在我答案中的代码中,add()
函数返回另一个函数,即内部函数。因此,当我们再次调用add()
时,函数不会执行var counter=0相反,它执行返回的函数,该函数包含代码return++计数器代码>。我希望它能带来更多的清晰。