函数
主要参考:https://wangdoc.com/javascript/types/function.html
函数的第二次生声明会覆盖第一次。
斐波那契数列:1,1,2,3,5,8,13,21,34....
要求指定第几个就可以算出对应的值,代码实现:
function fib(num){
if(num===0){return 0;}
if(num===1){return 1;}
return fib(num-2)+fib(num-1);
}
console.log(fib(6));
//输出8
函数本身有自己的作用域,其作用域与变量一样,是在声明到的地方,而不是在调用的地方。
函数的中重点知识:闭包
var n=99;
function f1(){
console.log(n);
}
f1()
以上代码说明了在函数f1内部可以调用外部的全局变量n,但是呢,在函数外部却不能调用函数内部声明的变量,代码如下所示:
function f1(){
var n=99;
}
console.log(f1(n));
//error:n is undefined
我们有时候会使用函数内部的变量,但是直接调用时不会成功的,在这里我们会用到在函数内部再声明一个函数来解决这个问题。
function f1(){
var n=99;
function f2(){
console.log(n);
}
return f2;
}
var result =f1();
result();
在JS中内部函数可以看见外部函数的变量,但是外部函数看不到内部的,也就是说父对象看不到子对象的变量,但是子对象可以看见父对象的变量,叫做JS中的“链式作用域”。子对象可以实现一步一步向上寻找父对象的变量
闭包有两个用处,一个是可以实现访问函数内部的变量,另一个是让子对象可以记住其父对象的环境,让这些变量一直存在于内存中。它也可以实现封装私有属性和私有方法。
unction create(start){
return function(){
return start++;
};
}
var inc=create(5);
console.log(inc());
console.log(inc());
console.log(inc());
//返回5 6 7
对以上数据这样解释:在函数及外部声明一个外部变量并让create(5)
赋值给它,当再次引用inc()
时,会访问create()函数,第一次start=5,然后再访问的时候运行++运算,现在变成6,然后变成7,之所以用闭包,也就是可以让这个数据一直都在上一次的运算上进行下一次运算。
function Person(name){
var _age;
function setAge(n){
_age=n;
}
function getAge(){
return _age;
}
return {name:name,
getAge:getAge,
setAge:setAge};
}
var p1=Person('马强');
p1.setAge(23);
console.log(p1.getAge());
//输出23
以上代码为实现私有属性的封装。
但是闭包不能滥用。
I IFE(立即执行的函数表达式)
只对匿名函数使用,可以避免污染全局变量,它也可以封装一些外部无法执行的私有变量。
(function () {
var tmp = newData;
processData(tmp);
storeData(tmp);
}());
网友评论