1、作用域
定义
简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期
-
全局作用域:用 var 在全局(函数外)声明的所有变量,都具有全局作用域
可以理解为,在全局作用域声明的变量是全局变量,在任何地方都可以使用
var a = 10 //声明了全局变量
console.log(a) //此处可调用 a 变量
function f(){
console.log(a) // 函数内可调用 a 变量
}
在函数中没有声明的变量会自动提升到全局作用域,即为全局变量
function f() {
a = "LB";
// 此处可调用 a变量
console.log(a) //结果为undefined
}
// 此处可调用 a变量
console.log(a) //结果 报错 Uncaught ReferenceError: a is not defined
image.png
- 函数作用域:在函数中用 var 声明的所有变量,都是函数的局部变量,具有局部作用域,即:变量只能在函数内部使用,函数外部是不行的
function f(){
var b = 11;
// 函数内可调用 b 变量
console.log(b) //结果 11
}
// 函数外调用 b 变量,就会报错
console.log(b) //结果 11
image.png
闭包
定义: 闭包是指有权访问另一个函数作用域中的变量的函数
function A(){
var a = 10; // 垃圾回收机制
return function(sum){
console.log(a)
a = sum
console.log(a)
}
}
let f= A()
f(11)
- 为什么要使用闭包或者什么时候(场景)需要使用:因为作用域的问题,函数外部不能访问函数内部的变量,当我们想访问函数内部的变量的时候,就得用到闭包,闭包的形式是:一个函数里面面返回另一个函数
1.避免全局变量污染; 2.可以设置私有变量
缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露
-
块级作用域:ECMAScript 6(简称ES6)中新增了块级作用域
在 ES6 之前,是没有块级作用域的概念,ES6 新增 let 关键字或者 const 关键字来实现块级作用域
重点:let 或 const声明的变量只在 let 或 const命令所在的代码块 {} 内有效,在 {} 之外不能访问
{
let name = "LBipanda";
// 这里访问到 name 为 LBipanda
}
// 在外面访问不到 name变量
{
// 在另个代码块也访问不到 name变量
}
2、预解析 : 通过var 声明的变量 和function 声明的变量,在程序开始执行之前会提升上代码最顶部,先提生var 声明的变量,再提升function声明的函数整体
例一、
a()
var a = function(){
console.log(11)
}
a()
function a(){
console.log(10)
}
a()
a = function(){
console.log(12)
}
a()
例二、
function Foo() {
getName = function(){ alert(1); };
return this;
}
Foo.getName = function() { alert(2); };
Foo.prototype.getName = function(){ alert(3); };
var getName = function() { alert(4); };
function getName(){ alert(5); }
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
例一、结果 //10 11 11 12
例二、结果 //2 4 1 1 2 3
网友评论