谈谈 javascript 的函数表达式及其应用

我们都知道定义函数的方式有两种,一种是 函数声明 ,另外一种就是 函数表达式 。 函数声明 语法为:function关键

我们都知道定义函数的方式有两种,一种是 函数声明

,另外一种就是 函数表达式

函数声明

语法为:function关键字后跟函数名。例如:

function functionName(arg0) {

//函数体

}

alert(functionName.name) // "functionName"

函数声明最主要的特征就是 函数声明的提升

,所以我们可以把函数声明放在调用它的语句的后面,因为执行代码前会先读取函数声明。比如:

hello();

function hello(){

alert("hello");

}

上面的代码可以在浏览器正常运行。

函数表达式

语法如下:

var functionName = function(arg0){

//函数体

};

alert(functionName.name) // ""

如上所示当我们输出函数名时返回了空字符串,因为function关键字后面没有标识符,这种情况下创建的函数为匿名函数。接下来我们就谈谈利用函数表达式所创建的匿名函数有什么应用。

应用

函数表达式最典型的应用就是模仿块级作用域,我们都知道JavaScript没有块级作用域,不过我们可以用函数表达式模仿块级作用域。形成独立作用域,从而 避免全局污染

操作方法:声明匿名函数,立马调用。

最经典的例子:

function createFunctions(){

var result = [];

for (var i=0; i < 10; i++){

result[i] = function(){

return i;

};

}

return result;

}

createFunctions();

乍一看每个函数都应该返回自己的索引值,即位置0的函数返回0,1的返回1,以此类推。实际上每个函数都将返回10,因为这里的i是贯穿整个作用域的,我们把上面代码修改一下:

//写法1

(function(){

//这里是块级作用域

var result = [];

for(var i=0;i<10;i++){

result[i] = (function(num){

return function(){

return num;

};

}(i))();

}

return result;

})(); //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

//写法2

var hasfunction = function(){

var result = [];

for(var i=0;i<10;i++){

result[i] = (function(num){

return function(){

return num;

};

}(i))();

}

return result;

}

hasfunction();

在立即执行函数执行的时候,i的值被赋值给num,同时创建返回num的闭包,从而result数组每个函数都有一个num变量的副本。

完。

未登录用户
全部评论0
到底啦