js-----关于this

来源:互联网 发布:bp算法和bp神经网络 编辑:程序博客网 时间:2024/05/22 05:15

function   这个东西我觉得是js最。。。。。的地方   

基础的东西xujiaxuliang有个帖子说的很不错了  就不再费事啰嗦了      http://topic.csdn.net/u/20090217/13/653f7949-9e0c-4e99-adb3-dcbc99fca8d5.html?52639(讲的很不错   初学的话很应该看一下   可惜我当年没看到。。。。)

-----先讲this   

特别说一下this的一个语言设计错误   这个要小心了    说不定什么时候this就出乎意料的绑到全局去了

 最开始发现这个问题是给页面上一个组件加事件 虽然用的EXT但是js的本质。。。后果很严重啊  (因为我是学了一周的js就拿它干活了   理论还不很扎实 所以得靠工作中一点点犯错误来学习了。。。。

Douglas Crockford大师把this古怪的行为解释为和函数的调用模式有关

 

  js中有四种调用模式---方法、函数、构造器以及apply调用模式,它们在初始化this时候是不一样的

 

方法模式 简单的说就是使用点表达式或是下标表达式来调用 这里定然是有对象的 这种情况下 this的绑定发生在调用的时候 绑的自然是调它的那个对象了

函数模式 这个就更简单了  函数名加调用运算符('()')  不过要小心  这个this绑的可是全局对象  不管你写哪了。。。

(可以理解成  你不给我指明了   我就自己给它加个全局对象。。。。。)

看个例子吧

var value=3;  //这个是个全局变量
var obj = {
  value : 1,
  getValue : function (){
     return this.value;
  }
}
obj.double=function (){
  dd = function () {
    this.value=this.value*2;   //这里的this已经绑定到全局对象了
    alert(this.value);// 6
  }
  dd();
  alert(this.value);  //1
}

obj.double();
alert(obj.getValue());   //1

/*+++++++++++++++++++++++解决这个问题的方法++++++++++++++++++++++++++++++++++*/
var value=3;
var obj = function (){
  this.value = 1;
  this.getValue = function (){
     return this.value;
  };
  this.double=function (){
   var that = this;   //这里的是引用    (关于引用还是复制 我会单独讲讲。。。)
  function dd () {
    that.value=that.value*2;
    alert(this.value);    //3
  }
  dd();
  alert(this.value);   //2
  }
}
var t = new obj();
t.double();
alert(t.getValue());  //2

 

构造器调用模式  一句话就是用new来调用的  new的时候this就绑定到新对象上了  比较好理解

apply调用模式  apply是函数的一个方法吧 你想把谁绑定到this 就直接把它作为第一个参数传给apply就好了

 

  比较不好理解的就是函数调用模式了  用惯了块级作用域自然是不好接受这种行为   先接受js没有块级作用域这个事实就好理解js很多很古怪的行为了(我是从c系转过来的  当年c系没学好 一定程度上为我学js扫除了些障碍==    认识它之后就不想回头了。。。。。

原创粉丝点击