当前位置: 移动技术网 > IT编程>开发语言>JavaScript > js中闭包和立即执行函数(代码实例)

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

2018年02月10日  | 移动技术网IT编程  | 我要评论

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");
}();

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网