关于c++:CC语言知识总结函数执行过程js变量提升和和this指向

一、函数被调用

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

二、执行

执行函数和函数外部函数的出入栈。

三、回收

执行实现后,后入函数进行先出栈,出栈后被回收(销毁)。

收费分享学习材料与视频,收费学习直通车。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理