首页 > 语言 > JavaScript > 正文

浅谈Javascript中的函数、this以及原型

2024-05-06 15:08:42
字体:
来源:转载
供稿:网友

关于函数

在Javascript中函数实际上就是一个对象,具有引用类型的特征,所以你可以将函数直接传递给变量,这个变量将表示指向函数“对象"的指针,例如:

function test(message){     alert(message);   }   var f = test;   f('hello world');

你也可以直接将函数申明赋值给变量:

var f = function(message){     alert(message);      };f('hello world');

在这种情况下,函数申明中可以省略函数名称,因为此时名称已经没有任何意义,我们可直接通过变量f来调用函数。

通过Function类型,我们可以更好地理解函数即对象:

var f = new Function("message","alert(message);");f('hello world');

关于this

this可以看成调用函数的实际作用域上下文。比较以下函数的执行结果:

function test(){     this.property = 'hello world';   }   test();   alert(window.property);  //由于在全局范围内调用,test函数中的this实际指向全局对象(window)   var obj = {};   test.call(obj);   //通过call第一个参数指定执行上下文范围,所以test函数中this指向obj实例。   alert(obj.property);      var obj2 = {};   obj2.test2 = test;   //将obj2实例方法test指向 全局test方法   obj2.test2();      //由于是在obj2上调用test方法,所以test函数中的this也指向了obj2实例   alert(obj2.property);

定义类型

在Javascript中可以定义构造函数,构造函数与一般函数没有任何区别,在创建实例时,如果我们使用了new关键字,那么这个函数就具有构造函数的特性,否则就是一般函数,如下所示,我们定义了一个Person类型:

function Person(){   this.name = 'xfrog';   this.Say = function(){     alert(this.name);   };}

当使用new关键字时,可以创建一个新的Person对象实例:

var p1 = new Person();p1.Say();

如果不使用new关键字,将直接执行Person函数,由于执行上下文为全局范围,故name属性和Say方法将被添加到window对象:

Person();Say();window.Say();

原型

注意上述Person的定义方式,当使用new来创建Person实例时,将会执行Person构造函数,也就是会声明name属性和Say方法,这样可能产生效率问题,注意以下代码:

var p1 = new Person();var p2 = new Person();var test = p1.Say == p2.Say;

比较p1和p2两个Say函数指针,返回false,表示每个Person实例中的Say方法都是独立的,而事实上Say函数的功能是完全一样的,我们完全没有必要为每个对象重新分配Say函数”对象“,如果Person实例很多,将会造成大量的内存耗用。

如果将Say函数提取出来放入全局执行范围,似乎可解决次问题:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选