这篇文章主要介绍了 JavaScript 中的方法调用详细介绍, JavaScript 中, 如果 function 属于一个对象, 那么通过对象来访问该 function 的行为称之为 "方法调用", 需要的朋友可以参考下
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
JavaScript 中,如果 function 属于一个对象,那么通过对象来访问该 function 的行为称之为 "方法调用"。与普通的函数调用不同的是,在进行方法调用时,function 中的 this 指代将发生变化 — this 将指代用于调用该 function 的对象 (该对象将成为方法调用的 invocation context):
- var x = 99;
- var sample = {
- x:1,
- act:function(a){
- this.x = a*a;//assign value to sample's x, not global object's x.
- }
- }
- sample.act(6);
- console.log(sample.x);//36
- console.log(x);//99
与访问对象中的 property 一样,除了使用点号操作符,JavaScript 中还可以通过使用中括号操作符来进行方法调用:
- //other ways to invoke method
- sample["act"](7);
- console.log(sample.x);//49
对于 JavaScript 中的 function,一个比较有趣的行为是可以在 function 中嵌入 function(闭包)。在进行方法调用时,如果方法 function 中有嵌入的 function,那么这个嵌入的 function 中的代码可以访问到外部的变量值:
- //nested function can access variable outside of it.
- var y = 88;
- var sample2 = {
- y:1,
- act2:function(a){
- this.y = inner();
- function inner(){
- return a*a;
- }
- }
- }
- sample2.act2(8);
- console.log(sample2.y);//64
- console.log(y);//88
不过,与直觉相反的是,嵌入 function 中的代码无法从外部继承 this;也就是说,在嵌入的 function 中,this 指代的并不是调用方法的对象,而是全局对象:
- //nested function does not inherit "this". The "this" in nested function is global object
- var sample3 = {
- act3:function(){
- inner();
- function inner(){
- console.log(this);//window object
- }
- }
- }
- sample3.act3();
如果确实需要在嵌入 function 中访问到调用方法的对象,可以在外部 function 中将 this 值保存到一个变量中:
- //pass "this" to nested function
- var sample4 = {
- act4:function(){
- var self = this;
- inner();
- function inner(){
- console.log(self);//Object {act4=function()}
- }
- }
- }
- sample4.act4();
来源: