共计 1121 个字符,预计需要花费 3 分钟才能阅读完成。
一、函数被调用
1、函数不存在,报错。
2、函数存在,进入调用函数贮存栈(先入后出),期待此函数外部函数调用实现后,在继续执行此函数。
变量晋升
- 1、初始化 arguments 变量
- 2、外部变量晋升和函数晋升
2.1、函数名和变量名重名时候,函数名优先级大于变量名。例如:
`// 函数名优先级大于变量名 | |
function test(){console.log(a); // ƒ a(){} | |
var a = 1; | |
function a(){}; | |
var a = function (){}; | |
} | |
test();` | |
* 1 | |
* 2 | |
* 3 | |
* 4 | |
* 5 | |
* 6 | |
* 7 | |
* 8 | |
2.2、函数晋升是剪切,不是复制。例如:
`// 函数晋升是剪切,不是拷贝 | |
function test(){console.log(a); // ƒ a(){} | |
var a = 1; | |
function a(){}; | |
console.log(a); // 1 在这里的值不是 'ƒ a(){}' 的起因是,函数 a 变量晋升时候被剪切到了结尾 | |
var a = 2; | |
console.log(a); // 2 | |
} | |
test();` | |
* 1 | |
* 2 | |
* 3 | |
* 4 | |
* 5 | |
* 6 | |
* 7 | |
* 8 | |
* 9 | |
* 10 | |
创立作用域链
建设作用域链,不便找到对应的变量是否有值。
确定 this 指向
1、间接调用函数的 this 指向 windows
2、对象外部函数,谁调用,this 指向谁
例子:
`// 对象外部函数,谁调用,this 指向谁 | |
let obj = { | |
a : '1', | |
test : function(){console.log(this.a) //1 | |
} | |
}; | |
obj.test();` | |
* 1 | |
* 2 | |
* 3 | |
* 4 | |
* 5 | |
* 6 | |
* 7 | |
* 8 | |
3、构造函数中,this 指向实例对象
例子:
`// 构造函数中,this 指向实例对象 | |
function Obj(name){this.name = name;}; | |
var obj1 = new Obj('打工人') | |
console.log(obj1); // Obj {name: "打工人"}` | |
* 1 | |
* 2 | |
* 3 | |
* 4 | |
* 5 | |
* 6 | |
4、人工的进行批改 this 指向,call,apply,bind 中,this 指向它们前面的第一个参数 5、箭头函数,箭头函数没有本人的 this,它如果有外层函数,那么 this 就指向外层函数,如果没有,则指向 windows
例子:
`// 箭头函数 this 指向 | |
var a = 'windows'; | |
function test(){ | |
var a = 'test'; | |
console.log(this.a); // windows | |
this.a = a; | |
(() => {console.log(this.a); // test | |
})()}; | |
test();` | |
* 1 | |
* 2 | |
* 3 | |
* 4 | |
* 5 | |
* 6 | |
* 7 | |
* 8 | |
* 9 | |
* 10 | |
* 11 | |
二、执行
执行函数和函数外部函数的出入栈。
三、回收
执行实现后,后入函数进行先出栈,出栈后被回收(销毁)。
收费分享学习材料与视频,收费学习直通车。
正文完