vue深度解析----var和let的区别

vue深度解析

es6 语法- var -const- let 用法详解

javascript作用域

javascript只有函数作用域,没有块级作用域。
即在fucntion里面定义的变量是有作用域的,if、for等代码块定义的变量是没有作用域的。
<!DOCTYPE html>
<html lang="en">
​
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>ES6语法-var-const-let用法详解</title>
</head>
​
<body>
  <div id="app">
    <button>测试1</button>
    <button>测试2</button>
    <button>测试3</button>
  </div>
  <script>
    //作用域代码
    if(true){
      //externalVal没有作用域
      var externalVal = "externalVal";
    }
    function domainTest(){
      var funVal ="funVal";
      //这里可以访问到externalVal和funVal
      console.log(externalVal + "----" + funVal);
    }
    domainTest()
    if(true){
      console.log(externalVal); //可以访问到externalVal
      //console.log(funVal); 这一行访问不到变量,报错
    }
​
    //使用var定义变量的局限性
    var btns = document.getElementsByTagName('button')
    for(var i = 0;i < btns.length;i++){
      btns[i].onclick = function(){
        alert("点击了第" + i + "个按钮");
      }
    }
  </script>
</body>
</html>
​
​

是因为for

为什么会一直出现的是3呢?这是因为作用域,for代码块没有作用域,当循环for结束的时候,监听的i是几?肯定是3,那么当我们点击按钮的时候i就是3。所以打印出来的就是"点击了第三个按钮 " var作用域在js中存在的缺陷,在ES6版中,使用新定义的变量let就可以解决。

let用法

是为了解决es6之前版本,var作用域本身存在缺陷,使用新的定义变量let 可以解决。

添加代码的话

  <div id="app">
    <button>测试1</button>
    <button>测试2</button>
    <button>测试3</button>
  </div>
  <script>
    //作用域代码
    if(true){
      //externalVal没有作用域
      var externalVal = "externalVal";
    }
    function domainTest(){
      var funVal ="funVal";
      //这里可以访问到externalVal和funVal
      console.log(externalVal + "----" + funVal);
    }
    domainTest()
    if(true){
      console.log(externalVal); //可以访问到externalVal
      //console.log(funVal); 这一行访问不到变量,报错
    }
​
    //使用var定义变量的局限性
    let btns = document.getElementsByTagName('button')
    for(let i = 0;i < btns.length;i++){
      btns[i].onclick = function(){
        alert("点击了第" + (i +1)+ "个按钮");
      }
    }
  </script>

因为let定义的变量自带块级作用域

const用法

当我们希望定义的变量不要被二次赋值的时候(也就是常量),使用const关键字来定义。

const c = 80;
c = 100;//报错 
const c; //报错,常量定义的时候必须赋值

ES6语法--对象的增强写法

ES5中对象最令人觉得繁琐的就是构造函数、prototyp、依靠原型链实现继承。因为它使用的不是面向对象的语法,所以使用过程比较混乱。

代码

    function Player(name,age){//定义对象
      this.name = name;
      this.age = age;
    }
    //定义对象的成员函数
    Player.prototype.toPrint = function(){
      alert(this.name + "---" + this.age)
    }
    var player1 = new Player("james",35);
    var player2 = new Player("kobe",39);
    player1.toPrint()  //james---35  调用函数方法
    player2.toPrint()  //kobe---39
​
​

ES5中对象最令人觉得繁琐的就是构造函数、prototyp、依靠原型链实现继承。因为它使用的不是面向对象的语法,所以使用过程比较混乱。下面我们结束如何使用简介的ES6语法定义对象和继承的增强语法。

10.说一说Vue2.0 双向绑定的原理与缺陷? 得分点: Object.defineProperty、getter、setter

标准回答: Vue响应式指的是:组件的data发生变化,立刻触发视图的更新 原理: Vue 采用数据劫持结合发布者-订阅者模式的方式来实现数据的响应式,通过Object.defineProperty来劫持数据的setter,getter,在数据变动时发布消息给订阅者,订阅者收到消息后进行相应的处理。 通过原生js提供的监听数据的API,当数据发生变化的时候,在回调函数中修改dom 核心API:Object.defineProperty 作用: 用来定义对象属性 特点: 默认情况下定义的数据的属性不能修改 描述属性和存取属性不能同时使用,使用会报错 响应式原理: 获取属性值会触发getter方法 设置属性值会触发setter方法 在setter方法中调用修改dom的方法 加分回答 Object.defineProperty的缺点 :

一次性递归到底开销很大,如果数据很大,大量的递归导致调用栈溢出 不能监听对象的新增属性和删除属性 无法正确的监听数组的方法,当监听的下标对应的数据发生改变时

教育政府医疗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值