当我们开发JavaScript应用时,作用域和闭包是非常重要的概念,理解这两个概念能够提高我们的代码质量和编程技能。下面我来给大家分享一些关于JavaScript作用域和闭包的完整攻略。
了解JavaScript的作用域
在JavaScript中,变量的作用域有两种,全局作用域和局部作用域。
全局作用域
当变量在函数外声明时,它就具有了全局作用域。例如:
var num = 10;
function multiply(x) {
return x * num;
}
console.log(multiply(5)); // 输出50
在上面的代码中,变量num
在函数外声明,因此它拥有全局作用域,即在整个代码中都可访问。
局部作用域
当变量在函数内声明时,它就具有了局部作用域。例如:
function multiply(x) {
var num = 10;
return x * num;
}
console.log(multiply(5)); // 输出50
在上面的代码中,变量num
在函数内声明,因此它只在函数作用域内可访问。
示例一
var num1 = 10;
function multiply() {
var num2 = 5;
return num1 * num2;
}
console.log(multiply()); // 输出50
console.log(num2); // 报错:num2未定义
在上面的代码中,变量num1
在函数外声明,它具有全局作用域,在函数内可以访问。而变量num2
在函数内声明,它只在函数内部可访问,函数外部无法访问,因此当我们在函数外部访问变量num2
时,会抛出一个未定义的错误。
了解JavaScript的闭包
JavaScript闭包是当一个函数可以访问它的外部作用域时发生的。例如:
function parentFunc() {
var num = 10;
function childFunc() {
console.log(num);
}
return childFunc;
}
var ret = parentFunc();
ret(); // 输出10
在上面的代码中,childFunc
是一个内部函数,它可以访问它的外部函数parentFunc
中的变量num
。当我们调用parentFunc
函数时,它返回childFunc
函数,我们将返回值保存在变量ret
中。然后我们再次调用ret()
函数,该函数将输出num
的值10。
示例二
function add(a) {
return function(b) {
return a + b;
};
}
var add5 = add(5);
console.log(add5(3)); // 输出8
在上面的代码中,add
是一个内部函数,它返回一个函数。我们在第一行代码中调用add
函数,并传入一个参数5
。add
函数返回一个匿名函数,我们将它保存在add5
变量中。然后,我们再次调用add5
变量对应的函数,传入3
作为参数,该函数将返回5 + 3
的值8。这就是闭包的另一个例子,内部函数可以访问外部函数中的参数和变量。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:你真的了解JavaScript的作用域与闭包吗 - Python技术站