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扫除了些障碍== 认识它之后就不想回头了。。。。。