首页 > 技术文章 > js函数定义及一些说明

zkb9604 2019-09-16 19:06 原文

1.javascript定义函数的三种方法
一、function语句//这个方法比较常用
function fn(){
  alert("这是使用function语句进行函数定义");
}
fn();

二、Function()构造函数 
var F = new Function("a","b","alert(a+b)");
F(a,b);

其实相当于如下代码:
function F(a,b){
  alert(a+b);
}

三、函数直接量//这个方法比较常用
var zhenn = function(){
  alert("zhenn");
}
zhenn();
虽然函数直接量创建的是未命名函数,但是它的语法也规定它可以指定函数名,这在编写调用自身的递归函数时非常有用,例如: 
var f = function fact(x) { 
if (x <= 1) { 
return 1; 
} else { 
return x * fact(x - 1); 

};

注:它并没有真正创建一个名为fact()函数,只是允许函数体用这个名字来引用自身。JavaScript1.5之前的版本中没有正确实现这种命名的函数直接量。

2.其他说明
一、构造函数
其实从字面上理解,构造函数似乎也是函数,其实它并不是函数,而只是一种函数模型。
要实例化才能运行,就跟我们写的类一样,要new一下才能用。
function Fn(){ //定义构造函数  
  this.elem ="字符串";  
  this.fn = function(){    
    alert("函数");  
  }
}
var f = new Fn(); //实例化
alert(f.elem);
f.fn();

二.Function()构造函数和函数直接量差别 Function()构造函数和函数直接量之间的差别有一点就是:使用构造函数Function()创建的函数不使用词法作用域,相反的,它们总是被顶级函数来编译,如: var y = "global";

function constructFunction() { 
var y = "local"; 
//Function()构造函数 
return new Function("return y;");//不使用局部作用域 

function constFunction() { 
var y = "local"; 
//函数直接量 
var f = function () { 
return y;//使用局部作用域 
}; 
return f; 

alert(constructFunction()()); //显示 global,因为Function()构造函数返回的函数并不使用局部作用域 
alert(constFunction()());//显示 lobal,因为函数直接量返回的函数并使用局部作用域

三.函数直接量详细说明
在一些框架代码中偶尔会看到这样的写法:(如jquery)
代码一:
var tempObject = function doFunction() {
...
}();

代码二:
(function doFunction() {
...
})();

如果我把这个单独拿出来,你可能也一眼就看出来这段代码的巧妙之处了--它在构造函数直接量的同时直接运行了此函数,而第二种代码相对第一种而言更简洁了(PS:第二种代码用一对小括号避免了编译错误)。

推荐阅读