今天将用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>