标签:
在W3C中函数的定义是这么说的:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。
诚然,从这种抽象的定义中我们得不到什么有价值的东西。下面,举例来列举出函数的几种定义方式:
function add(num1, num2) {
return num1 + num2; } var add = function (num1, num2) { return num1 + num2; }//这是比较常见的两种
//下面两种比较少见
var add=new Function("num1","num2","return num1+num2");
var add=Function("num1","num2","return num1+num2");
上面四种写法均是创建一个函数正确的语法。但是,常见的一般是前两种。因为相比于前两种,后两种存在着一些缺陷。
var x = 1;
var add = (function () {
var x = 100;
return function (num) {
return num + x;
}
}());
console.log(add(0));//100
var x = 1;
var add = (function () {
var x = 100;
return new Function(‘num1‘, ‘return num1+x‘);
}());
console.log(add(0));//1
也就是说,后两种方式创建的函数,不能组成完整的函数作用域链(后面会讲到),也不可能有所谓的闭包之说。
var array = [
];
for (var i = 0; i < 1000; i++) {
array[i] = function () {
return ‘undefined‘;
}
}//第一种
var array = [
];
for (var i = 0; i < 1000; i++) {
array[i] = new Function("return undefined");
}//第二种,
这两种方式在运行效率上存在着很大的差距。对于,第一种只需要执行一次function(){},其他的999次都是赋值,而后一种要执行一千遍的函数创建并赋值。
正是因为三面的三种原因,才使得function(){}这种方式比较 流行。
另外,你可能也见过下面的这种,但是这种形式只是一种变体。
var add = new function () { return 1 + 2; }; console.log(typeof add);//object var result = add.constructor();/*调用时必须采用这种调用方式*/ console.log(result);//3
这种形式,new function()创建的实质上是利用一个匿名函数创建一个对象。这个对象的一个constructor属性正好指向其构造函数,也就是这个匿名函数。所以实际上这 是一种丑陋的写法。
到这里,我们也就只是叙述了一下,定义函数的几种方式。通过比较,我们知道前两种比较实用,但是即使这样,第一种和第二中的定义方式也存在着巨大的不同。下一小节,我们接着讲这两种方式存在的差异。
标签:
原文地址:http://www.cnblogs.com/renlong0602/p/4281463.html