【无标题】

this的指向

在js中,将一个对象给一个变量,是先把一个对象的内存地址赋给变量,调用这个对象的时候先读取变量存储的地址,在获取原始属性,例如 var obj = { foo:  5 };

由于函数是上下文结构,不是字典结构,所以需要一个能指向当前运行环境的机制,就是this

 var f = function () {
  console.log(this.x);
}

全局环境
  

this === window // true

function f() {
  console.log(this === window);
}
f() // true

       this在全局环境下运行,自然就是指向window

构造函数 


var Obj = function (p) {
  this.p = p;
};

var o = new Obj('Hello World!');
o.p // "Hello World!"

        this在构造函数中指向了p,这个p所在的构造函数被实例对象调用,所以相当于this指向了这个实例对象
 

 调用方式

1.作为对象方法的调用

function f() {
    console.log( this.code );
}
let obj = {
    code: 200,
    f: f
};
obj.f(); // 200

2.纯粹的函数调用

function f() {
    console.log( this.code );
}
// 此处,通过var(函数作用域)声明的变量code会绑定到window上;如果使用let(块作用域)声明变量code,则不会绑定到window上,因此下面的2次函数调用f(),会输出undefined
// let code = 200;
var code = 200;
f(); // 200
code = 404;
f(); // 404

 

3 箭头函数中的this

箭头函数中的this是定义函数时绑定的,而不是在执行函数时绑定。若箭头函数在简单对象中,由于简单对象没有执行上下文,所以this指向上层的执行上下文;若箭头函数在函数、类等有执行上下文的环境中,则this指向当前函数、类。

var code = 404;
let obj = {
    code: 200,
    getCode: () => {
        console.log(this.code);
    }
}
obj.getCode(); // 404

在箭头函数中,this 的值是在定义函数时确定的,而不是在运行时确定的。在这个例子中,箭头函数 getCode 是在对象 obj 定义时创建的,而不是在调用 obj.getCode() 的时候。

箭头函数中的 this 指向的是外层的词法作用域的 this 值,而不是指向调用它的对象。在全局作用域中,this 指向的是全局对象(在浏览器环境中通常是 window 对象)。所以,当箭头函数中使用 this.code 时,它实际上是引用全局作用域中的 code 变量,其值为 404。

箭头函数中的this

        在对象中,指向上层运行环境

        在函数中,指向函数当前运行环境

        在类中,不管是箭头函数还是普通函数,this都指向实例对象

同步异步,宏任务微任务


同步:一个一个执行

异步:例如请求一个网站,主线程不管,等到执行完,主线程才调用执行结果

   要实现多线程,就得分同步和异步

宏任务和微任务都是异步任务。

        宏任务常用有 script settimeout setinterval postmessage

        微任务常用 promise.then

执行流程:

        先同步再异步,先微任务,执行完所有的微任务,再一个一个执行宏任务

1.同步任务

2.微任务

3.宏任务

遇到同步任务直接执行,遇到微任务就放到微任务队列中,宏任务同理

  当同步任务执行完了,再将微任务队列加入到主线程执行,最后将宏任务队列加入到主线程中执行

闭包


闭包是两层函数,内部函数能够访问外部函数的变量,

        解决的问题:保存一个持续累加的值,把一个内部函数一直在计算的自由变量保存在外部函数中

因为return完后垃圾回收会将这个值回收

另外:在python中可以将这个值设置成全局变量,就不会销毁了, globol [变量]
 

你可能感兴趣的:(javascript,前端,vue.js)