美文网首页
JS学习笔记/6.3

JS学习笔记/6.3

作者: Wyyyn | 来源:发表于2017-06-03 22:28 被阅读0次

    代码块与作用域

    顶层作用域声明的变量哪里都可访问,虽然在JS中可以跨越块级作用域,但是这样访问变量容易引起混乱,产生bug,我们应避免跨越块级作用域。在ES6中,新增的let关键字禁止了块级作用域变量的访问,这样可以有效的避免错误发生。

    var x=0;
    funcyion fun()
    {
      console.log(x);
      var x=1;
      x++;
    }
    fun();
    

    上面这段代码的运行结果为unedefined,在JS中,一个作用域里声明的变量在这个作用域里只用一个指向,因为子作用域里又声明了另一个重名的局部变量x,导致腹肌作用域的变量被覆盖而无法访问。应避免起重名的变量名,使每个作用域都变得严谨。

    隐藏参数this

    this的指向(在对象中的用法)

    • 无任何前缀的函数调用时,this指向全局对象。
    • 方法调用时,this指向方法所在的对象或被调用的对象。
    • 构造函数里,this指向新生成的实例。
      在函数中,将含有this的对象方法取出来单独执行,此时this指向全局对象。
    • apply/call调用时,this指向apply/call方法中的第一个参数。
      apply/call的功能是通过传参的方式,强制函数内的this指定某一对象,this的引用会被指向apply/call的第一个参数。
      apply与call的不同:对其他参数的传递方式不同,对于apply,剩余的参数将通过数组来传递,而call直接按参数列表传递。
      var display=function(words)
      {
      console.log(this.name+"said:"+words[0]+""+words[1]+".");
      }
      display.call({name:"bower"},["I'm a","robot"])
      //上句等同于display.apply({name:"bower"},[["I'm a","robot"]])
      因为words本身是一个数组,当使用apply传递时应将words[]放入数组中。

    遇到的问题

      var robot_1 = {
          name : "bower",
          say : function(){
                  console.log(this.name);
              }
      }
      var robot_2 = {
       name : "cup"
      }
      robot_2.say = robot_1.say;
      robot_2.say()
    

    以上代码执行结果为 cup
    robot_2的say属性值不应该是经赋值后的robot_1执行say函数的值吗?但是robot_2没有say函数,执行robot_2.say()后的结果为什么会是cup?
    ——————
    robot_1的函数say赋给robot_2,robot_2有了robot_1方法,输出的便是cup。
    .....

    相关文章

      网友评论

          本文标题:JS学习笔记/6.3

          本文链接:https://www.haomeiwen.com/subject/ddwmfxtx.html