请参考以下攻略:
JavaScript变量提升
什么是变量提升?
变量提升是 Javascript 中的一种特性,它指的是在代码执行前,所有的变量声明都会被提升到代码的开头部分,但是赋值操作并不会被提升。也就是说,变量声明后的变量名可以在声明之前被使用,但是变量值会返回 undefined。
示例一:
console.log(a); // Output: undefined
var a = 5;
变量 a 的声明被提升到代码的顶部,但是赋值操作并没有被提升。所以,输出的是 undefined。
示例二:
console.log(sum(4, 6)); // Output: 10
function sum(a, b) {
return a + b;
}
函数声明也可以被提升,所以函数可以在声明之前被使用。
let 和 const 的变量提升
let 和 const 的变量提升与 var 的不同。它们会将声明封装在一个称为暂存死区 (Temporal Dead Zone / TDZ) 的区域内,变量在此期间就不能被访问。
示例:
console.log(a); // Output: ReferenceError
let a = 5;
let 的变量声明没有被提升,所以访问 a 会引发 ReferenceError 错误
JavaScript闭包
什么是闭包?
闭包是 Javascript 中一个非常重要的概念,也是一个函数与其词法作用域中的变量环境的集合体。在一个函数内部,我们可以访问到本函数作用域中的变量和全局作用域中的变量。当本函数执行完后,这个作用域通常就会被销毁,但是当存在一个闭包时,这个被销毁的作用域仍旧存在,并且可以被外部环境所访问。
示例一:
function outerFunction() {
var name = "Alice";
function innerFunction() {
console.log(name);
}
return innerFunction;
}
var myFunction = outerFunction();
myFunction();
innerFunction() 定义在 outerFunction() 的内部,也就是在一个私有的作用域内。但是让它成为了闭包,是因为它被外部函数返回,并且可以访问到它定义时的作用域中的变量。在这个例子中,innerFunction() 可以访问 name 变量,因为它定义在 outerFunction() 中。
示例二:
function add(x) {
return function(y) {
return x + y;
}
}
var addFive = add(5);
console.log(addFive(4)); // Output: 9
在这个示例中,add() 函数返回了一个闭包,它通过定义一个函数返回另一个函数。这个闭包可以访问 add() 中定义的变量,因为它拥有 add() 中定义的作用域。在这个例子中,闭包可以访问 x 的值 5。在调用 addFive(4) 时,闭包会将 5 和传入的参数 4 相加,返回 9。
以上就是 JavaScript 变量提升和闭包理解的攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript变量提升和闭包理解 - Python技术站