this指向问题

调用一个函数会暂停当前函数的执行,传递控制权和参数给新的函数。除了生命是定义的形式参数,每个函数还接收两个附加的参数:this,和arguments。参数this在面向对象编程中很重要,它的值取决于调用的模式。在JavaScript中一共有四种调用模式:方法调用模式,函数调用模式,构造器调用模式和apply调用模式。这些模式在初始化关键参数this上有差异。

方法调用模式

当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this绑定到该对象

var myObject = {
  value:0,
  increment:function (inc) {
    this.value += typeof inc === 'number' ? inc : 1;
  }
};

myObject.increment();
console.log(myObject.value); //1

myObject.increment(2);
console.log(myObject.value); //3

方法可以使用this访问自己所属的对象,所以它能从对象中取值,或者对对象进行修改。this到对象的绑定发生在调用的时候

函数调用模式

当一个函数并非一个对象的属性时,那么它就是被当作一个函数调用。

var sum = add(1,4);

用这种模式来调用函数时,this被绑定到全局对象。这是JS语言设计上的一个错误。如果语言设计正确,那么当内部函数被调用时,this应该仍然绑定到外部函数的this变量。这个设计错误的额后果就是方法不能利用内部函数来帮助它完成工作,因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权。
解决的方法是在该方法内部定义一个变量并把它赋值给this

myObject.double = function () {
  var that = this;
  var helper = function () {
    that.value = add(that.value,that.value);
  };
  helper();
};
myObject.double();

我尝试将函数helper内部this和that的值输出
this所指向的这个对象本身有很多属性,重要的是这些属性中包含setTimeout,setInterval,clearTimeout等等这些函数,由此可见,helper函数内部this本身保存的是对于全局对象的引用
helper函数内部可以通过that变量访问到函数外部的this,其输出的值是

{ value: 3,
  increment: [Function: increment],
  double: [Function] }

由上可见,myObject对象调用double方法时,double方法内部this所指向的是对于myobject对象的引用,但是其内部函数this的值却指向了全局对象,所以我们需要使用that变量来保存对于myObject对象的引用。

构造器调用模式

JS中,一切皆对象。对象是“名/值“对的集合并拥有一个连接到原型对象的隐藏连接。对象字面量产生的对象连接到Object.prototype。函数对象连接到Function.prototype(该原型对象本身连接到Object.prototype)。每个函数在创建时回附加两个隐藏属性:函数上下文和实现函数行为的代码。

如果在一个函数前面带上new来调用,那么背地里将会创建一个连接到该函数prototype成员的新对象,同时this会被绑定到新对象上。

//创建一个名为Quo的构造器函数,它构造一个带有status属性的对象
var Quo = function (string) {
  this.status = string;
}
//给Quo的所有实例提供一个get_status的公共方法
Quo.prototype.get_status = function () {
  return this.status;
};

//构造一个Quo的实例
var myQuo = new Quo("confused");
console.log(myQuo.get_status());//输出confused

刚看到异常的额知识点,总结在一起啦

异常

异常是干扰程序的正常流程的不寻常(但并非是出乎意料的)。当发现事故时,我们的程序应该抛出一个异常

var add = function(a,b){
  if(typeof a !== 'number' || typeof b !== 'number'){
        throw{
          name:'TypeError',
          message:'add needs numbers'
    };
  }
  return a+b;
}

throw语句中判断函数的执行,它应该抛出一个exception对象,该对象白喊一个用来识别异常类型的name属性和一个描述性的message属性。我们也可以添加其他属性。
该exception对象将会被传递到一个try语句的catch从句:

var try_it = function(){
  try{
    add('seven');
  }catch(e){
   document.writeln(e.name + ':' + e.message);
  }
}
try_it();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值