资源描述:
《javascript中的四种函数调用》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、javascript中四种函数调用模式及对this的不同绑定By saymoon on 2009年10月27日撰写此文源于最近在看DouglasCrockford的’JavaScript:TheGoodParts’中文译本《Javascript语言精粹》时,发现一些自己不知道或者没有一下子理解的东西,拿出来细细研究并记录一下。函数被作为很重要的一部分在书中做了详细的介绍和举例。感觉函数的四种调用方式和在不同调用方式上’this’绑定的不同是个重点也是难点。欢迎大家一起研究。方法调用模式:调用形式:通过’.'点表达式或[
2、subscript]下标表达式调用一个对象中的方法。this绑定:this被绑定到被调用方法所属的对象上。例子:帮助123456789101112131415161718192021222324// 创建myObject对象。它有一个value属性和一个increment方法。// increment方法接收一个可选参数。如果参数不是数字,那么默认使用数字1。
varg='global';
varmyObject={ value:0, increment:function(inc
3、){ document.writeln(this.g); this.value+=typeofinc==='number'?inc:1; // 在方法被调用时this被绑定为myObject对象。 }};
document.writeln(this.g); // global // 打印出全局变量g的值,说明this被绑定在全局对象上。myObject.increment(); // 在这里in
4、crement方法才被调用,this才被绑定到myObject对象,这是特有“超级”迟绑定(verylatebinding)。 // 这时打印出的this.g为undefined,因为myObject中没有g这个属性,可以看出这时this被绑定到了myObject对象上。
document.writeln(myObject.value); // 1document.writeln(this.g); // global
5、 // 打印出全局变量g的值,函数调用结束后,this又被从myObject对象上绑定回全局对象上。
myObject.increment(2);document.writeln(myObject.value); // 3函数调用模式:调用形式:当一个函数并非一个对象的属性时,它被当作一个函数来调用。this绑定:this被绑定到全局对象上。例子:执行下面的代码会发现,输出的结果是全局对象中g的值,与我们预期的结果不同,this被错误地绑定到全局对象上,这是Jav
6、aScript语言设计上的一个错误。帮助123456varg='global';
varo=function(){ varg='self';document.writeln(this.g); // global this被错误地绑定到全局对象。}();如果设计正确的话,当内部函数被调用时,this应该绑定到外部函数的this变量。解决该错误的方法:在函数中定义一个变量并给它赋值为this,那么内部函数就可以通过那个变量访问到被绑定到外部函数的正确this。按照约定,我们给那个变量命名为tha
7、t。帮助123456789101112131415varadd=function(a,b){ returna+b;};
// 给myObject增加一个double方法。
myObject.double=function(){ varthat=this; // 解决方法
varhelper=function(){that.value=add(that.value,that.value); // 这里的that被绑定到外部函数myObject.8、double上}; helper(); // 以函数的形式调用helper1617181920
};
myObject.double();document.writeln(myObject.value); // 6构造器调用模式:调用形式:在函数名前加new来调用。this绑定