关于函数
在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函数提取出来放入全局执行范围,似乎可解决次问题:
新闻热点
疑难解答
图片精选