发表于: 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函数。
评论