javascript函数表达式详细解决方案及实例

Javascript的函数表达式

第一阶

定义函数有两种方式:一种是函数语句,另一种是函数表达式;

1.1函数声明


函数的函数名(参数){
函数
}



函数声明的一个重要特性是函数声明被提升,这意味着函数声明在代码执行之前将被读取。这意味着你可以把函数放在调用它的语句后面:


(HelloWorld); / /会先执行读代码中的函数语句
功能HelloWorld(){
console.log(Hello World);
}



1.2函数表达式


VAR函数名=函数(arg){
函数
}



这种形式似乎是一个普通的变量赋值语句,即创建一个函数,并将它赋给变量函数名。在这种情况下创建的函数被称为一个匿名函数。因为没有标识符后面的功能关键词。

函数表达式与其他表达式一样,必须在使用前分配;例如,下面的代码会导致错误;


(HelloWorld); / /错误,而不是赋值函数不存在

VaR的HelloWorld =函数(){
console.log(Hello World);
}




通过函数表达式,我们可以动态地将函数赋给一个函数表达式;例如,下面的代码:


VaR的HelloWorld; / /声明
如果(条件){条件
(HelloWorld =功能){ / /分配
console.log(Hello World);
}
}
别的{
(HelloWorld =功能){ / /分配
console.log(你好,世界);
}
}



二、递归函数

递归函数是通过名称调用自身的函数中的形式的条件下(C #语言,所以程序的核心理念是相同的,只是一些不同的语法,学习一种语言学习的基础,其他的会容易很多),一个经典的递归的面试问题,如下表编号规则为:1, 1, 2、3, 5, 8、第三十位数字是13, 21, 34 ......多少,用递归算法实现的,如下面的代码所示:


函数富(n){
如果(n 0)
返回0;
否则如果(n=0 n <=2)
返回1;
其他的
返回富(n - 1)+(n - 2);
}



虽然这个函数表示它似乎不是问题,但是下面的代码会导致它出错:


VaR匹配foo1 = foo;
=空;
console.log(匹配foo1(34));



上面的代码保存foo()中的变量匹配foo1第一功能,然后设置foo变量为空,结果指向的原始功能是唯一的一个。但当我们调用匹配foo1()下一步,我们必须执行foo()和foo是空的,所以它会导致错误。在这种情况下,arguments.callee可以解决这个problem.arguments.callee是一个指向函数的指针被执行,因此它可以用来实现递归调用函数


函数富(n){
如果(n 0)
返回0;
否则如果(n=0 n <=2)
返回1;
其他的
返回arguments.callee(n - 1)+ arguments.callee(n - 2);
}



也可以使用命名函数表达式来实现相同的结果:


var =(函数f(n){)
如果(n 0)
返回0;
否则如果(n=0 n <=2)
返回1;
其他的
f(n - 1)f(n - 2);
});



三。关闭

3.1封是一个函数有权访问另一个函数变量的作用域,和一个共同的方法来创建闭包是函数内部创建另一个函数。理解闭包,你必须先了解Javascript的特殊变量的作用域,变量的范围无非是两种全局变量和局部变量;然后我们写几个演示直观地表达了出来;

函数在函数内直接读取全局变量。


var = 100;定义全局变量。
函数FN(){
console.log(N); / /功能直接读取全局变量
}

(FN);




无法从本地变量直接读取该函数。


函数FN(){
var = 100;
}

console.log(N); / / N没有定义



这里要注意的一点是,在函数中声明变量时,必须使用var,如果不使用变量,它将成为全局变量。


函数FN(){
n=100;
}
(FN);
console.log(N); / / 100



有时我们需要在函数内部声明变量,这样我们就可以使用通常创建闭包的方法在函数中创建另一个函数。


函数FN(){
n=100;

功能FN1(){
console.log(N);
}

(FN1);
}
FN();100




在上面的代码中,函数FN1包括在回调函数,当所有的局部变量在FM对FN1可见。但反过来,在FN1局部变量可见FN都没有。这就是链范围结构,是Javascript语言独特,和子对象会看在水平和级别的所有父对象的变量。因此,父对象的所有变量都可见到子对象,反之亦然。

FN1可以读取FN的内部变量,只要FN1作为返回值,这允许我们读的FN在变量。


函数FN(){
n=100;

功能FN1(){
console.log(N);
}

返回FN1;
}

var结果= FN();
结果();100




在这种情况下,FN1是关闭,并关闭了一个函数,读取等功能的内部变量,因为在Javascript语言,只有局部功能可以通过子函数中的阅读,我们可以简单的理解为关闭功能定义在一个函数。因此,从本质上说,一个闭包一座桥连接着一个函数的内部函数的外面。

3.2闭包的使用

它有两个应用程序:一个是读取函数内部变量的程序,另一个是保存这些变量在内存中的值:


函数FN(){
n=100;

纳德=函数(){
n=1;
}

功能FN1(){
console.log(N);
}

返回FN1;
}

var结果= FN();
结果();100
NAdd();
结果();101




注意:因为闭包函数占用包含它的函数的范围,它将占用比其他函数更多的内存。过度使用闭包会导致内存占用太多,因此在退出函数之前将删除不使用的本地变量。

四,块级范围

块级范围(也称为私有域)中的匿名函数的语法如下所示:


(函数({){)
块级范围
});



只要有一些变量的临时需要,就可以使用私有范围,例如:


(函数(){())
var现在=新日期();
如果(现在,获得当前的月份)(0)(now.getdate = = = = 1){
警惕(新年快乐);
}
});



如果你把上面的代码放在全球范围内,如果1月1日来了,你会有一个快乐的新年祝福。这种技术通常被用于在全球范围内功能外,从而限制了变量和函数的全局范围的增加。总的来说,我们应该尽量少加变量和函数的全局范围尽可能小。在一个大的应用涉及到很多开发商,太多的全局变量和函数很容易导致命名冲突。创建一个私有的范围,每个开发者都可以使用它自己的变量,而不必担心全球范围。

谢谢你的阅读。我希望你能帮助你,谢谢你对这个站的支持。