案例一:
var name = 'World!'
;(function(){
if(name === 'undefined'){
var name = 'Jane'//此处函数内变量提升;因此为undefined
console.log(name)
}else{
console.log(name)
}
})()
立即执行函数和变量提升声明
案例二:
var a = 6;
setTimeout(function(){
console.log(0);
alert(a);
a = 666;
},0)
console.log(1)
a = 66;
由于setTimeout是异步因此先执行七外部代码即使其设置的时间为0;因此到alert的时候a=66;虽然在其后面将全局a的值改成666(都是在主线程执行)
案例三:
function fn1(){
var a = 2;
function fn2(){
a++;
console.log(a);
}
return fn2;
}
var f = fn1();
f(); //3
f(); //4
闭包
案例四:
由于var声明的是全局变量;alert出来的始终是循环之后的最后值;修改方法将var改为let或者使用闭包(如下图)
案例五:
var name = "A";
var obj = {
name = "B",
getNamefunc:function(){
return function(){
return this.name;
}
}
}
console.log(obj.getNamefunc()()); //A
主要是看返回的this.name中的this是谁。由于
obj.getNamefunc()()
调用的这个函数,因此是默认的调用即this指向的是windows,那么最后的console出来的那么就是指向全局的name为A
var name = "A";
var obj = {
name = "B",
getNamefunc:function(){
var that = this; //缓存this
return function(){
return that.name;
}
}
}
console.log(obj.getNamefunc()()); //B
案例六(原型与原型链):
function A(){
}
A.prototype.n = 1;
var b = new A();
A.prototype = {
n = 2,
m = 3
}
var c = new A();
console.log(b.n,b.m); //1 undefined
console.log(c.n,c.m); //2 3
案例七(原型、实例对象与原型链):
var F = function(){}
Object.prototype.a = function (){console.log('a()')}
Fuction.prototype.b = function (){console.log('b()')}
var f = new F();
F.a(); //a()
F.b(); //b()
f.a(); //a()
f.b(); //error;因为f不是function只是实力对象,其原型链上没有b;而F是个函数,函数也是object因此上面两个都可以打印出来
案例八:
function fun(n,o){
console.log(o)
return{
fun:function(m){
return fun(m,n)
}
}
}
var a = fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1);
c.fun(2);
c.fun(3);
结果图