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++) {
        
            /*立即执行函数:读到它就会被执行,但是下面的函数还是赋值函数,不会立即被执行,这里需要注意一个问题是在这里立即执行函数执行完被销毁之后,下面的function(){}AO是在原来执行上下文的基础上*/
            (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");
}();


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值