JS学习笔记/6.3

代码块与作用域

顶层作用域声明的变量哪里都可访问,虽然在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)