发表于: 2018-12-10 19:18:44

1 636


今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin) 

学习jsthis。

一直对这方面的知识点把握不是特别好。所以专门看了一下。

执行上下文

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

  • 全局代码: 一段<script>标签里,有一个全局的执行上下文。所做的事情是:变量定义、函数声明

  • 函数代码:每个函数里有一个上下文。所做的事情是:变量定义、函数声明、this、arguments

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

全局执行上下文

全局执行上下文

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

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

  • var定义的全局变量==>undefined, 添加为window的属性

  • function声明的全局函数==>赋值(fun), 添加为window的方法

  • this==>赋值(window)

(2)开始执行全局代码

函数执行上下文

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

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

  • 形参变量==>赋值(实参)==>添加为执行上下文的属性

  • arguments==>赋值(实参列表), 添加为执行上下文的属性

  • var定义的局部变量==>undefined, 添加为执行上下文的属性

  • function声明的函数 ==>赋值(fun), 添加为执行上下文的方法

  • this==>赋值(调用函数的对象)

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

执行上下文栈

  • 1.在全局代码执行前, JS引擎就会创建一个栈来存储管理所有的执行上下文对象

  • 2.在全局执行上下文(window)确定后, 将其添加到栈中(压栈)

  • 3.在函数执行上下文创建后, 将其添加到栈中(压栈)

  • 4.在当前函数执行完后,将栈顶的对象移除(出栈)

  • 5.当所有的代码执行完后, 栈中只剩下window

this

this指的是,调用函数的那个对象。this永远指向函数运行时所在的对象。

解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this。

根据函数的调用方式的不同,this会指向不同的对象:【重要】

  • 1.以函数的形式调用时,this永远都是window。比如fun();相当于window.fun();

  • 2.以方法的形式调用时,this是调用方法的那个对象

  • 3.以构造函数的形式调用时,this是新创建的那个对象

  • 4.使用call和apply调用时,this是指定的那个对象

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


this的几种场景:

  • 1、作为构造函数执行

例如:

    function Foo(name) {

        //this = {};

        this.name = name;

        //return this;

    }

    var foo = new Foo();


  • 2、作为对象的属性执行

    var obj = {

        name: 'A',

        printName: function () {

            console.log(this.name);

        }

    }

    obj.printName();

  • 3、作为普通函数执行

   function fn() {

        console.log(this); //this === window

    }

    fn();

  • 4、call apply bind

明天计划的事情:(一定要写非常细致的内容) 

继续学习js的知识

遇到的问题:(遇到什么困难,怎么解决的) 

暂无。

收获:(通过今天的学习,学到了什么知识)

学习了this函数。


返回列表 返回列表
评论

    分享到