JS闭包

今天将用demo继续学习闭包,function scope。
以下是一个实现,思维还是很混乱,暴露出了问题。

function outerTest(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i] = function(num){
          return innerTest(num);
        }(i)
    }
    return arr;
}
function innerTest(i){
    var t=setTimeout("console.log(i)",2000);
    return i;
}
var test = outerTest();
for(var i=0;i<5;i++){
    console.log(test[i]());
}

以下是实验代码,闭包部分理解不够,在网上找的例子

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
</head>

<body>
    <div id="wrap">
        <input type="button" value="按钮一" />
        <input type="button" value="按钮二" />
        <input type="button" value="按钮三" />
        <input type="button" value="按钮四" />
        <input type="button" value="按钮五" />
    </div>
</body>
<script type="text/javascript">
//原型链
function Super() {
    this.type = "玩具";
}
Super.prototype.say = function() {
    console.log("我是" + this.type + "</br>");
}

function Sub(type) {
    this.type = type;
}

Sub.prototype = new Super();

var sub = new Sub("毛绒");
sub.say();
console.log(sub.constructor + "</br>");
console.log(sub.__proto__ + "</br>");
console.log(Sub.prototype + "</br>");
console.log(Sub.constructor + "</br>");
console.log(Super.prototype.isPrototypeOf(sub) + "</br>");
//借用构造函数
function Super1(name) {
    this.say = function() {
        console.log(name + "只想做一个安静的美男子");
    }
}

function Sub1(name) {
    Super1.call(this, name);
}
var sub1 = new Sub1("安娜");
sub1.say();
//组合继承,复用+自己
function Super2(name) {
    this.type = "玩具";
    this.say = function() {
        console.log(name + "只想做一个安静的美男子");
    }
}
Super2.prototype.but = function() {
    console.log("却因为太帅无法实现");
}

function Sub2(name) {
    Super1.call(this, name); //调用super构造函数1次
}
//var sub2 = new Sub2("安娜");
//sub2.say();
//sub2.but();//sub2.but is not a function
Sub2.prototype = new Super2(); //调用super构造函数2次
var sub22 = new Sub2("安娜");
sub22.say();
sub22.but();
//原型式继承
var Super3 = {
        type: "玩具",
        size: ["big", "small", "media"]
    }
    //将对象传入object返回新对象
var sub3 = Object(Super3);
sub3.size.push("你猜");
var sub31 = Object(Super3);
sub31.size.push("还有什么");
console.log(sub31.size);
//寄生式继承
//把Object(Super3)当做函数封装了,该引用还得引用

//寄生组合式继承,不必指定子类的原型调用超类的构造函数
function bridge(subO, superO) {
    var prototype = Object(superO.prototype); //调用1次super方法
    prototype.constructor = subO; //增强对象
    subO.prototype = prototype; //指定对象
}
//闭包的实现
//function outer(){
//  var res = [];
//  return function(){
//    for(var i=0;i++;i<5){
//      res[i] = i;
//    }
//  }
//}
//var res = outer();
//console.log(res);
//console.log(res[1]);

//写的不对,再来
//function outer(){
//  var res = [];
//  return res[i] = function(){
//    for(var num=0;num++;num<5){
//      res[num] = num;
//    }
//  }
//}
//写的不对,再来
//function outer(){
//  var res = [];
//  for(var num=0;num<5;num++){
//    res[num] = num;
//  }
//  return res;
//}
//var res = outer();
//for(var num=0;num<5;num++){
//  console.log(res[num]);
//}
//写的不对,再来
//并不是res[num] = num;那么简单
function outer() {
    var res = [];
    for (var num = 0; num < 5; num++) {
        res[num] = function() {
            return num;
        };
    }
    return res;
}
var funcs = outer();
for (var num = 0; num < 5; num++) {
    console.log(funcs[num]());
}
console.log("那么闭包的使用场景是?");
//按钮点击绑定
//轮询取回数据
//达到闭包所要的效果,不是返回绑定的事件而是值
//1.匿名函数里的匿名函数
//按钮点击绑定
var wrap = document.getElementById('wrap'),
    inputs = wrap.getElementsByTagName('input');

wrap.onclick = function(ev) {
    var ev = ev || window.event,
        target = ev.target || ev.srcElement;
    for (var i = 0, l = inputs.length; i < l; i++) {
        if (inputs[i] === target) {
            alert(i)
        }
    }
}

//2.函数里的外部函数
//业务中用到
function fetEchMore(oneData) {
    var defer = $.Deferred();
    if (oneData !== undefined) {
        QN.top.invoke({
            cmd: 'taobao.ump.promotion.increment.get',
            param: {
                item_id: oneData.base_info.item_id
            },
            success: function(rsp) {
                oneData.ump = rsp.ump_promotion_increment_get_response.promotions.promotion_in_item.item_promo_price;
                defer.resolve(oneData);
            },
            error: function(error) {
                console.log(error);
                defer.reject();
            }
        });
    }
    return defer.promise();
}

function fetchMoreRecursive(startIndex, data) {
    if (data !== undefined) {
        fetchMore(data[startIndex]).then(function(res) {
            console.log(res); //监测字段是否添加成功
            if (data[++startIndex] !== undefined) {
                fetchMoreRecursive(data)
            }
        });
    }
};
//闭包中的this对象
var name = 'Jack';
var o = {
    name: 'bingdian',
    getName: function() {
        return function() {
            return this.name;
        };
    }
}

console.log(o.getName()()); //Jack
var name = 'Jack';

var o = {
    name: 'bingdian',

    getName: function() {
        var self = this;
        return function() {
            return self.name;
        };
    }
}

console.log(o.getName()()); //bingdian


发现理解的不到位, 只是一个例子在错误的理解下看上去刚好解释的通, 今天将继续学习闭包,
function scope, 以下是一个实现, 思维还是很混乱, 暴露出了问题。
function outerTest() {
    var arr = [];
    for (var i = 0; i < 5; i++) {
        arr[i] = function(num) {
            return innerTest(num);
        }(i)
    }
    return arr;
}

function innerTest(i) {
    var t = setTimeout("console.log(i)", 2000);
    return i;
}
var test = outerTest();
for (var i = 0; i < 5; i++) {
    console.log(test[i]());
}
</script>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值