JS基础2

函数

主要参考: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);
}());

你可能感兴趣的:(JS基础2)