(十九)基础知识案例分析

案例一:
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);

结果图

原文地址:https://www.cnblogs.com/smileyqp/p/12675296.html