作用域

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
    }
*/