设为首页 加入收藏

TOP

作用域和闭包的通俗理解(一)
2018-03-18 16:21:17 】 浏览:508
Tags:作用 包的 通俗 理解

面试问题:


涉及到的知识点:


执行上下文主要有两种情况:


PS:注意“函数声明”和“函数表达式”的区别。


在执行全局代码前将window确定为全局执行上下文。


(1)对全局数据进行预处理:(并没有赋值)


(2)开始执行全局代码


在调用函数, 准备执行函数体之前, 创建对应的函数执行上下文对象(虚拟的, 存在于栈中)。


(1)对局部数据进行预处理:


(2)开始执行函数体代码


this指的是,调用函数的那个对象


需要特别提醒的是:this的指向在函数定义时无法确认,只有函数执行时才能确定。


 


this的几种场景:


例如:


    functionFoo(name) {
        //this = {};
        this.name = name;
        //return this;
    }


    var foo = new Foo();


    var obj = {
        name: 'A',
        printName: function () {
            console.log(this.name);
        }
    }


    obj.printName();


作用域指一个变量的作用范围。它是静态的(相对于上下文对象), 在编写代码时就确定了。


作用:隔离变量,不同作用域下同名变量不会有冲突。


作用域的分类:


if (true) {
    var name = 'smyhvae';
}
console.log(name);


上方代码中,并不会报错,因为:虽然 name 是在块里面定义的,但是 name 是全局变量。


直接编写在script标签中的JS代码,都在全局作用域。


在全局作用域中:


全局作用域中的变量都是全局变量,在页面的任意的部分都可以访问到。


变量的声明提前:


使用var关键字声明的变量( 比如 var a = 1),会在所有的代码执行之前被声明(但是不会赋值),但是如果声明变量时不是用var关键字(比如直接写a = 1),则变量不会被声明提前。


举例1:


    console.log(a);
    var a = 123;


打印结果:undefined


举例2:


    console.log(a);
    a = 123;  //此时a相当于window.a


程序会报错:



函数的声明提前:


也就是说,它会在所有的代码执行之前就被创建,所以我们可以在函数声明之前,调用函数。


很好理解,因为此时foo被声明了,且为undefined,并没有给其赋值function(){}


所以说,下面的例子,会报错:



调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁。


每调用一次函数就会创建一个新的函数作用域,他们之间是互相独立的。


在函数作用域中可以访问到全局作用域的变量,在全局作用域中无法访问到函数作用域的变量。


在函数中要访问全局变量可以使用window对象。(比如说,全局作用域和函数作用域都定义了变量a,如果想访问全局变量,可以使用window.a


提醒1:


在函数作用域也有声明提前的特性:


因此,在函数中,没有var声明的变量都会成为全局变量,而且并不会提前声明。


举例1:


        var a = 1;


        functionfoo() {
            console.log(a);
            a = 2;    // 此处的a相当于window.a
        }


        foo();
        console.log(a);  //打印结果是2上方代码中,foo()的打印结果是1。如果去掉第一行代码,打印结果是Uncaught ReferenceError: a is not defined


提醒2:定义形参就相当于在函数作用域中声明了变量。


        function fun6(e) {
            console.log(e);
        }


        fun6();  //打印结果为 undefined
        fun6(123);//打印结果为123


区别1:


区别2:


联系:


当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用(就近原则)。如果没有则向上一级作用域中寻找,直到找到全局作用域;如果全局作用域中依然没有找到,则会报错ReferenceError。


外部函数定义的变量可以被内部函数所使用,反之则不行。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>//只要是函数就可以创造作用域//函数中又可以再创建函数//函数内部的作用域可以访问函数外部的作用域//如果有多个函数嵌套,那么就会构成一个链式访问结构,这就是作用域链//f1--->全局functionf1(){//f2--->f1--->全局functionf2(){//f3---->f2--->f1--->全局functionf3(){}//f4--->f2--->f1---->全局functionf4(){}}//f5--->f1---->全局functionf5(){}}</script>
</head>
<body>


</body>
</html>


理解:


查找一个变量的查找规则:


    var a = 1


    functionfn1() {
      var b = 2


      functionfn2() {
        var c = 3
        console.log(c)
        console.log(b)
        conso

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android基础知识:Activity中获取.. 下一篇Kotlin/Native应用程序开发指南

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目