欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js中闭包和立即执行函数(代码实例)

程序员文章站 2022-03-23 08:52:24
js中闭包和立即执行函数(代码实例) /* 每个javascript函数都是一个对象,对象中有些属性我们可以进行访问,但有些属性不可以,这些属性仅供javascript引...

js中闭包和立即执行函数(代码实例)

/*
 每个javascript函数都是一个对象,对象中有些属性我们可以进行访问,但有些属性不可以,这些属性仅供javascript引擎存取,其中[[scope]]就是其中一个
 作用域就是[[scope]]所指的,查找对象的时候从作用域量的顶端依次向下查找
 这里需要注意一个问题:执行上下文相对应GO :是按顺序从上往下执行的,其中销毁执行上下文AO:回到被定义的状态,等待下次被执行
 */

function a1() {
    console.log(a1);
    function b() {
        var b = 234;
        console.log(b)

    }

    var a = 123;
    b();
}
var glob = 100;
a1();
/*闭包:将内部函数被保存到外部
 闭包会造成的问题:原作用域链不会释放,会造成内存泄露
 */

/*闭包的作用:1:实现共有变量*/
function add() {
    var count = 0;

    function demo() {
        count++;
        console.log(count);
    }

    return demo;  //这里返回的是引用值即引用地址
}
var aa = add();
console.log(aa)
aa();

/*2:可以做缓存可以当做存储结构*/
function test() {
    var num = 100;

    function a() {
        num++;
        console.log(num);
    }

    function b() {
        num--;
        console.log(num);

    }

    return [a, b];
}

var myArr = test();
console.log(myArr);
myArr[0]();
myArr[1]();


function eater() {
    var food = " ";
    var obj = { //对象之中可以有方法即函数
        eat: function () {
            console.log(" i am eating" + food);
            food = "";

        },
        push: function (myfood) {
            food = myfood;
        }
    }
    return obj;
}
var eater1 = eater();
eater1.push("apple")
eater1.eat();

/*闭包:*/
function testb() {
    var arr = [];
    for (var i = 0; i < 10; i++) {
        arr[i] = function () {
            /*在for循环的时候i是变量未知数, 只有myarr[j]();执行的时候才知道i的值*/
            document.write(i + " ");
        }
    }
    return arr;
}


var myarr = testb();
for (var j = 0; j < 10; j++) {
    myarr[j]();
}
/*打印出十个10*/

/*改进打印出0-9*/
function test12() {
    var arr = [];
    for (var i = 0; i < 10; i++) {
        arr[i] = function () {
            /*立即执行函数:读到它就会被执行,但是下面的函数还是赋值函数,不会立即被执行*/
            (function (j) {
                arr[j] = function () {
                    document.write(j + " ");
                }
            }(i));
        }
    }
    return arr;
}

var myarr12 = test12();
for (var j = 0; j < 10; j++) {
    myarr12[j]();
}
/*打印出0-9*/
/*立即执行函数:此类函数没有声明,在一次执行完之后会立即被释放,适合做初始化的工作,读到它就会被执行
 初始化功能的函数:这个函数只使用一个
 */
(function () {
    var a = 124;
    var b = 34;
    console.log("和" + (a + b))
}())

(function (a, b) {
    console.log("和" + (a + b));
}(1, 3))


/*函数声明
 只有表达式才能被执行符号执行
 */
function test() {
    var aa = 123;
}
/*如下的样式才可以被执行
 被执行符号执行的表达式,函数名就会被放弃,也就是立即执行函数*/
var test = function () {
    console.log("aoaoaoao");
}();