作用域
于2023-08-25 17:05:46发布
75
作用域的一些必要知识(下面的知识都是建立在es5)
1、除了函数、es6的let,其余是没有块级作用域这个概念的; 如:
for(var i=0; i<10; i++) {}
console.log(i) // 输出10
if (true) {
var a = 20;
}
console.log(a) // 输出20
2. 作用域链:内部可以访问外部的变量,但是外部不能访问内部的变量。如 :
var a = 10
function func() {
console.log(a) // 可以访问外部变量a
var b = 20;
}
func()
console.log(b) // 访问变量b失败
注意!如果内部有变量,则优先使用内部的变量,否则才使用外部的变量。如:
var a = 10
function func() {
var a = 20
console.log(a) // 20
}
func()
3. 在一个函数内部,如果定义的变量没有用var,那就是全局的。如:
(function(){
var a = b = 10;
}())
console.log(b) // 输出10,b前面并没有var
4. 注意js是有变量提升机制
5. 优先级:声明变量 > 声明普通函数 > 参数 > 变量提升
考题1
function c() {
var b = 1;
function a() {
console.log(b);
var b = 2;
console.log(b);
}
a();
console.log(b);
}
c();
/*
undefined // 函数a的变量b产生变量提升了
2
1
*/
考题2
var a = 10;
function fun() {
if (false) { // 此条件不成立,不会执行。但是变量a会产生变量提升
var a = 20;
}
console.log(a)
}
fun();
/*
undefined
*/
考题3
function fun(a) {
console.log(a)
var a = 10
function a() { }
}
fun(100);
/*
ƒ a() { }
上面的代码结果需要参考这个 :声明变量 > 声明普通函数 > 参数 > 变量提升
fun(100)中的100是参数,优先级是3
console.log(a)是变量提升,优先级是4
function a() { } 是声明普通函数,优先级是2
*/
考题4
function fun() {
a = 10
console.log(a)
var a = 20
}
fun()
/*
10, a变量提升了,可以看成是这样
function fun() {
var a = undefined;
a = 10
console.log(a)
var a = 20
}
*/