# 闭包练习题

## 变量提升/作用域链练习题

``````    var a = [1];
var b =a;
b=[2];
console.log(a);

----------------------------

var a =[1];
b = a;
b[1]='a';
console.log(a);

----------------------------

//1.
console.log(a);
var a = 13;
function fn() {
console.log(a);
var a = 1;
}
fn();
console.log(a);

--------------------

//2.
console.log(a);
var a = 13;
function fn1() {
console.log(a);
a = 1;
}
console.log(a);

--------------------

//3.
//console.log(a);
a = 13
function fn() {
console.log(a);
a = 1;
}
fn();
console.log(a);

---------------------

//4.
var foo = 1;
function bar() {
if (!foo) {
var foo = 10
}
console.log(foo);
}
bar();

----------------------

//5.
function f5() {
f=ff();
return f;
function ff() {
return "f" in window;
};
var f;
}
console.log(f5());

--------------------------

//6.
var a = b = c = [1, 2, 3, 4];
b = 9;
a[1] = 0;
console.log(b[0]);
a = [1, 2, 3, 4];
c = [1, 2, 3, 4];
a[0] = b;
console.log(c);
console.log(a);

--------------------------

//7.
var ary = [1, 2, 3, 4];
function ff(ary) {
ary[0] = 0;
ary = [0];
ary[0] = 100;
return ary
}
var s = ff(ary);
console.log(ary);
console.log(s);

-------------------------------

//  8.
var a = 10, b = 11, c = 12;
function test(a) {
a = 1;
var b = 2;
c = 3;
}
test(10);
console.log(a);
console.log(b);
console.log(c);

--------------------------------

// 9
var fs = "hello";
(function (fs) {
console.log(fs);
var fs = fs || "world";
console.log(fs);
})(fs);
console.log(fs);

----------------------------------

var a = 9;
function ss() {
a = 0;
return function (b) {
return b + (a++)
}
}
var f = ss();
var m = f(5);
console.log(m);
var n = ss()(5);
console.log(n);
var x = f(5);
console.log(x);
console.log(a);

-------------------------------

//10
console.log(getA);
if("a" in window){
var a="1";
function getA(a) {
a=a||this.a;
console.log(a);
}
getA(a);
}

-----------------------------

//11----------(易错！！！！)
var a=2;
var obj1={
a:1,
fn1:(function (a) {
this.a=a;
a++;
return function () {
this.a=a++;
console.log(a);
}
})(a)
};
obj1.fn1();
var fn1=obj1.fn1;
fn1();

-------------------------------------

//12---------------（易错）
f = function () {return true;};
g = function () {return false;};
(function () {
if (g() && [] == ![]) {
f = function () {
return false;
};
return  console.log(f())
}
function g() {
return true;
};
})();
console.log(f());
console.log(g());

------------------------------------

var num =2;
var obj = {
num : 0,
fn : function () {
num = 1;
// this-->obj
(function (num) {
// this --> window
++this.num;
num++;
console.log(num)
})(this.num)
}
}
obj.fn();
console.log(window.num,obj.num)

---------------------------------------------

var num =1;
var obj = {
num : 2,
fn : (function () {
this.num *= 2;
num +=3;
var num =1;
return function () {
num +=2;
this.num +=2
console.log(++num)
}
})()
};
var f= obj.fn;
f();
obj.fn();
console.log(window.num,obj.num)

-----------------------------------------------

1. var num = 2
var obj = {num: 1};
obj.fn = (function (num) {
this.num += 2;
num--;
return function (n) {
this.num += 2;
num--;
console.log(n + ++num);
}
})(this.num);
var fn = obj.fn;
fn(2);
obj.fn(1);
console.log(num, obj.num);

------------------------------------

2. var num = 10;
var obj = {num: 15};
obj.fn = (function (num) {
this.num += 10;
num *= 2;
return function (n) {
this.num += n;
console.log(n + (--num));
}
})(obj.num);
var fn = obj.fn;
fn(10);
obj.fn(15);
console.log(window.num, obj.num);

-----------------------------------------

3. var number =2;
var obj = {
number :4,
fn1 : (function () {
this.number*=2;
number = number*2;
var number = 3;
return function () {
this.number*=2;
number*=3;
console.log(number);
}
})()
};
var fn1 = obj.fn1;
fn1(); obj.fn1();
console.log(window.number,obj.number);

---------------------------------------

1.
console.log(getA);

if("a" in window){
var a="";
function getA(a) {
a=a||this.a;
console.log(this.a);
}
getA(a);
}

---------------------------------------

//2.
var a=2;
var obj1={
a:1,
fn1:(function (a) {
this.a=a;
a++;
return function () {
this.a=a++;
console.log(a);
}
})(a)
};
obj1.fn1();
var fn1=obj1.fn1;
fn1();

--------------------------------------------

//3.

var ary=[1,2,3,4];
ary.forEach(function(item,index){
ary[index]=this;
});
console.log(ary);

----------------------------------------------

//4.
var b="b";
var obj2={
b:"B",
getB:function (b) {
this.b=b+this.b;
return this.b
}
};
console.log(obj2.getB("是"));

----------------------------------------------

//5.
var aa=20;
function bind() {
var aa=12;
function fn() {
console.log(this.aa);
}
box.onclick=function () {
fn();
}
}
box.onclick();

//6.
var c=3;
function getC() {
this.c++;
return function (c) {
c=this.c*2;
console.log(c);
}
}
var obj3={
c:2,
getC:(function () {//this.getC
this.c-=1;
return this.getC
})()
};
getC();
obj3.getC();
var f3=obj3.getC;
f3();
console.log(window.c);
console.log(obj3.c);

---------------------------------------------

//7.
function g1() {
this.g="gg"
}
var obj4={
g1:g1,
gg:function () {
g1();
}
};
obj4.g1();
obj4.gg();
console.log(obj4);
console.log("g" in window);

------------------------------------------

//9
var number=2;
var obj={
number:4,
fn1:(function () {
this.number*=2;
number=number*2;
var number=3;
return function () {
this.number*=2;
number*=3;
}
})()
};
var fn1=obj.fn1;
fn1();
obj.fn1();

--------------------------------------------

function fn(b) {
console.log(b);
if(1!=2){
console.log(b);
function b() {
console.log(b);
}
b();
console.log(b);
}
console.log(b);
b()
}
fn(1);

------------------------------------

if(false){
var a =1
}
console.log(a);

----------------------------------

``````

**原型练习题

``````原型作业题

//
function C1(name){
if(name) this.name = name;
}
function C2(name){
this.name =name;
}
function C3(name){
this.name = name ||'join';
}
C1.prototype.name='Tom';
C2.prototype.name='Tom';
C3.prototype.name='Tom';
console.log(new C1().name);
console.log(new C2().name);
console.log(new C3().name)

-----------------------------------------

function fun(){
this.a=0;
this.b=function(){
}
}
fun.prototype={
b:function(){
this.a=20;
},
c:function(){
this.a=30;
}
}
var my_fun=new fun();
my_fun.b();
my_fun.c();

----------------------------------------------

function Foo() {
getName = function () {
console.log(1);
};
return this;
}
Foo.getName = function () {
console.log(2);
};
Foo.prototype.getName = function () {
console.log(3);
};
var getName = function () {
console.log(4);
};
function getName() {
console.log(5);
}

Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();

--------------------------------------------

function Fn() {
this.x = 100;
this.y = 200;
this.getX = function () {
console.log(this.x);
}
}
Fn.prototype.getX = function () {
console.log(this.x);
};
Fn.prototype.getY = function () {
console.log(this.y);
};
var f1 = new Fn;
var f2 = new Fn;
console.log(f1.getX === f2.getX);
console.log(f1.getY === f2.getY);
console.log(f1.__proto__.getY === Fn.prototype.getY);
console.log(f1.__proto__.getX === f2.getX);
console.log(f1.getX === Fn.prototype.getX);
console.log(f1.constructor);
console.log(Fn.prototype.__proto__.constructor);
f1.getX();
f1.__proto__.getX();
f2.getY();
Fn.prototype.getY();

-----------------------------------------------

var name = 'zhufengpeixun'
var Fn =function (name){
var name = 'world'
this.name = 'zhufeng'
this.sex =function(){
this.name = 'hello'
}
}
var f1 = new Fn(name)
var f2 = new Fn('age')
console.log(f1.name)
console.log(f2.age)
f1.sex()
console.log(f1)
f1.sex === f2.sex
Fn.name == f1.name

--------------------------------------

function Fn(){
var a =1
this.a = a
}
Fn.prototype.say = function(){
this.a = 2
}
Fn.prototype = new Fn
f1.__proto__.b = function (){
this.a = 3
}
var f1 = new Fn
console.log(f1.a)
console.log(f1.prototype)
console.log(f1.b)
f1.hasOwnProperty('b')
'b' in f1
f1.constructor == Fn

--------------------------------------

var num = 0;
function Fn(num) {
arguments[0] = 10;
this.num = 20;
return num;
}
Fn.num = 40;
Fn.prototype.num = 30;
var f = new Fn(num);
Fn.prototype.getNum = function () {
console.log(this.num);
};
console.log(f.num);
f.getNum();
Fn.prototype.getNum();
console.log(num)
var n = Fn(num);
console.log(n);
console.log(num);

``````
• 序言：七十年代末，一起剥皮案震惊了整个滨河市，随后出现的几起案子，更是在滨河造成了极大的恐慌，老刑警刘岩，带你破解...
沈念sama阅读 155,958评论 4 358
• 序言：滨河连续发生了三起死亡事件，死亡现场离奇诡异，居然都是意外死亡，警方通过查阅死者的电脑和手机，发现死者居然都...
沈念sama阅读 66,179评论 1 286
• 文/潘晓璐 我一进店门，熙熙楼的掌柜王于贵愁眉苦脸地迎上来，“玉大人，你说我怎么就摊上这事。” “怎么了？”我有些...
开封第一讲书人阅读 105,792评论 0 237
• 文/不坏的土叔 我叫张陵，是天一观的道长。 经常有香客问我，道长，这世上最难降的妖魔是什么？ 我笑而不...
开封第一讲书人阅读 43,409评论 0 202
• 正文 为了忘掉前任，我火速办了婚礼，结果婚礼上，老公的妹妹穿的比我还像新娘。我一直安慰自己，他们只是感情好，可当我...
茶点故事阅读 51,723评论 3 285
• 文/花漫 我一把揭开白布。 她就那样静静地躺着，像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上，一...
开封第一讲书人阅读 40,174评论 1 204
• 那天，我揣着相机与录音，去河边找鬼。 笑死，一个胖子当着我的面吹牛，可吹牛的内容都是我干的。 我是一名探鬼主播，决...
沈念sama阅读 31,543评论 2 306
• 文/苍兰香墨 我猛地睁开眼，长吁一口气：“原来是场噩梦啊……” “哼！你这毒妇竟也来了？” 一声冷哼从身侧响起，我...
开封第一讲书人阅读 30,270评论 0 194
• 序言：老挝万荣一对情侣失踪，失踪者是张志新（化名）和其女友刘颖，没想到半个月后，有当地人在树林里发现了一具尸体，经...
沈念sama阅读 33,899评论 1 236
• 正文 独居荒郊野岭守林人离奇死亡，尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
茶点故事阅读 30,235评论 2 240
• 正文 我和宋清朗相恋三年，在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
茶点故事阅读 31,771评论 1 255
• 序言：一个原本活蹦乱跳的男人离奇死亡，死状恐怖，灵堂内的尸体忽然破棺而出，到底是诈尸还是另有隐情，我是刑警宁泽，带...
沈念sama阅读 28,139评论 2 249
• 正文 年R本政府宣布，位于F岛的核电站，受9级特大地震影响，放射性物质发生泄漏。R本人自食恶果不足惜，却给世界环境...
茶点故事阅读 32,688评论 3 228
• 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹，春花似锦、人声如沸。这庄子的主人今日做“春日...
开封第一讲书人阅读 25,936评论 0 8
• 文/苍兰香墨 我抬头看了看天上的太阳。三九已至，却和暖如春，着一层夹袄步出监牢的瞬间，已是汗流浃背。 一阵脚步声响...
开封第一讲书人阅读 26,646评论 0 192
• 我被黑心中介骗来泰国打工， 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留，地道东北人。 一个月前我还...
沈念sama阅读 35,194评论 2 265
• 正文 我出身青楼，却偏偏与公主长得像，于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子，可洞房花烛夜当晚...
茶点故事阅读 35,145评论 2 258