var、let、const、this

一、var let 区别

Js 作用域:全局作用域、函数作用域、块作用域(es6);
1、作用域不同: var 函数作用域;let、const 块作用域

相关参考:JS中全局作用域与局部作用域的理解    深入理解js的变量提升和函数提升

/*var 函数作用域
 * if、for属于块作用域  
*/
if(true) { var a = 3;}
console.log(a); // 3
for(var i=0; i<4; i++) {
	var b = 5;
};
console.log(i);	// 4 
console.log(b); // 5

/*let 块作用域*/
if(true) { let a = 3;}
console.log(a); // Uncaught ReferenceError: a is not defined
for(let i=0; i<4; i++) {
	var b = 5;
};
console.log(i);	// Uncaught ReferenceError: i is not defined
console.log(b); // 5

2、var 在变量声明之前访问提示 undefined,let 则直接提示 ReferenceError

ReferenceError、TypeError:引用错误和类型错误区别

作用域区别:ReferenceError在作用域中找不到;TypeError在作用域中找到了但是做了它不可能做的事情

二、this 详解

this: 当前执行上下文(global、function 或 eval)的一个属性,在非严格模式下,总是指向一个对象,在严格模式下可以是任意值。

1.全局上下文(global): 指向全局对象

// 在浏览器中, window 对象同时也是全局对象:
console.log(this === window); // true

let a = 37;
console.log(window.a); // 37

2.函数上下文(function):取决于函数被调用的方式

  // 2.1 非严格模式
  function f1(){
    return this;
  }
  //在浏览器中:
  f1() === window;   //在浏览器中,全局对象是window
  
  // 2.2 严格模式
  function f2(){
   "use strict"; // 这里是严格模式
    return this;
   }
   // 函数直接调用
   f2() === undefined; // true
   
   // 作为对象的属性或方法调用
   window.f2() === window; // true

   
   // 2.3示例: 对象可以作为 bind 或 apply 的第一个参数传递,并且该参数将绑定到该对象。
   var obj = {a: 'Custom'};

   // 声明一个变量,并将该变量作为全局对象 window 的属性。
   var a = 'Global';
   function whatsThis() {
    return this.a;  // this 的值取决于函数被调用的方式
   }
   whatsThis();          // 'Global' 因为在这个函数中 this 没有被设定,所以它默认为 全局/ window 对象
   whatsThis.call(obj);  // 'Custom' 因为函数中的 this 被设置为obj
   whatsThis.apply(obj); // 'Custom' 因为函数中的 this 被设置为obj

3.类上下文(eval)

与在函数中类似,因为类本质上也是函数,但也有一些区别和注意事项

  // 类中所有非静态的方法都会被添加到 this 的原型(静态方法不是 this 的属性,它们只是类自身的属性)
  class Example {
    constructor() {
      const proto = Object.getPrototypeOf(this);
      console.log(Object.getOwnPropertyNames(proto));
    }
    first(){}
    second(){}
    static third(){}
  }
  new Example(); // ['constructor', 'first', 'second']

4.axios 的回调函数中 this 不指向vue实例,为 underfind

   详见: axios的回调函数中this不指向vue实例,为undefined

相关参考:  this-MDN  

三、call()、apply()、bind()

作用:用来改变this的指向
区别:
  obj.myFun.call(db, param1,...,paramN);
  obj.myFun.apply(db, [param1,...,paramN]);
  obj.myFun.bind(db,'param1,...,paramN)(); // bind返回的是函数

相关参考:  call()、apply()、bind()的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值