复习下js的零碎知识点

prototype属性

****************************************************************
var x = 1;
console.log(this.x); // 1 全局的
console.log(window.x); // 1

****************************************************************
基本类型:string number boolean null undefined  bool 占一个字节 
其他四个占两个个字节  保存在栈空间  按值访问 
typeof(null) // object  js 的数据类型在底层都是以二进制的形式存储的 二进制前三位为0会被typeof 识别为object
typeof(undefined) // undefined  
undefined 和 null bool 转化后为都为 false  number 转化后 NaN0

引用类型:Array Function Object  占内存不固定 但内存地址是固定的
存储的是地址

****************************************************************
function a() {
	function b() {
		var bb = 234;
		aa = 0;
	}
	var aa = 123;
	b();
	console.log(aa);
}
var global = 100;
a();  // 0

****************************************************************
// 只要一个函数能通过new生成一个新对象 那这个函数一定有prototype属性
// 自定义的函数都有ptototype属性
// 函数通过new生成的一个对象 这个对象的原型(__proto__) 指向该函数的prototype
new F().__proto__  === F.prototype // true
Object.prototype.__proto__ === null // true
Function.__proto__ === Function.prototype // true

****************************************************************
// 闭包 函数的调用过程相当于栈
function a() {
	var num = 1;
	function b() {
		num ++;
		console.log(num);
	}
	return b;
}
var demo = a(); // a() 返回 b()
demo(); // b() b()保存着a()中的num  被从a里面return出来 num没有被释放  
demo(); // b()
// 2
// 3

闭包

****************************************************************
// 闭包 
function c() {
	function d() {
		var bbb = 234;
		console.log(aaa);
	}
	var aaa = 123; 
	return d;
}
var glob = 100;
var demo = c();
demo(); // 123 

****************************************************************
// 闭包 里面的内存没有被释放 能实现累加效果 一般函数调用完里面的变量会被释放
// 闭包做到了他没有被释放
function add() {
	var count = 0;
	function demo() {
		count ++;
		console.log(count);
	}
	return demo;
}
var counter = add();
counter(); 
counter();
// 1 2

****************************************************************
// 闭包 可以做缓存 
function test() {
	var num = 100;
	function a() {
		num ++;
		console.log(num);
	}
	function b() {
		num --;
		console.log(num);
	}
	return [a, b];
}
var myArr = test();
myArr[0](); // a()101
myArr[1](); // b()100

****************************************************************
// 闭包 缓存例子
function eater() {
	var food = '';
	var obj = {
		eat : function() {
			console.log("I\'m eating " + food);
			food = '';
		},
		push : function(myFood) {
			food = myFood;
		}
	}
	return obj;
}
var eater1 = eater();
eater1.push('apple');
eater1.eat();
// eater1.food === undefined  即是food访问不了 (实现了私有变量) 但他又存在 并且可以通过方法操作他
// 模块化开发,防止污染全局变量

****************************************************************
// 闭包 循环
function test() {
	var arr = []; 
	for(var i = 0; i < 10; i++){
		arr[i] = function() {
			console.log(i); // 主要是因为这里的i最终全变为了10 得想办法保留住
		}
	}
	return arr;
}
var myArr = test();
for(var j = 0; j < 10; j++){
	myArr[j](); // 打印10个10
}

循环添加事件

****************************************************************
// 闭包循环解决  立即执行函数 + 闭包
// 立即函数参考 https://www.jianshu.com/p/b10b6e93ddec
// 解决方案1
function test() {
	var arr = []; 
	for(var i = 0; i < 10; i++){
		(function(j) {
			arr[j] = function() {
				console.log(j);
			}
		})(i)
	}
	return arr;
}
var myArr = test();
for(var j = 0; j < 10; j++){
	myArr[j](); 
}
// 立即执行函数创建了10个独立的作用域 每个都保存着不同的j 

// 解决方案2
// 使用let ES6 新增了let命令,用来声明局部变量。它的用法类
// 似于var,但是所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束。
function test() {
	var arr = []; 
	for(let i = 0; i < 10; i++){
		arr[i] = function() {
			console.log(i);
		}
	}
	return arr;
}
var myArr = test();
for(var j = 0; j < 10; j++){
	myArr[j](); 
}

****************************************************************
// var 的使用 变量提升的是声明 
var a = 99;
f();
console.log(a); // 99
function f() {
	// var a;  a === undefined
	console.log(a); // undefined
	var a = 10; // a = 10;
	console.log(a); // 10 
}

****************************************************************
// var 和 let
{
	var i = 1;
}
console.log(i); // 1

{
	let j = 1;
}
console.log(j); // 报错

****************************************************************
for(var i = 0; i < 10; i++){
	setTimeout(function() { // 同步注册回调函数到异步的宏任务队列
		console.log(i) 
	}, 0);
}
// 10 个 10
for(let i = 0; i < 10; i++){
	setTimeout(function() { // 同步注册回调函数到异步的宏任务队列
		console.log(i) // i 是循环体内局部作用域,不受外界影响。
	}, 0);
}
// 0 1 2 3 4 5 6 7 8 9
let a = 1;
let a = 2;
// 报错

var a = 1;
var a = 2;
// 不报错

****************************************************************
function course(name, age) {
	// arguments 是实参数组
	console.log(age); // undefined 
	console.log(arguments[0]);
	console.log(name);
	console.log(arguments[1]); // arguments[1] == age == undefined
	console.log(arguments[2]); 
	arguments[1] = 2; // 
	console.log(age); // undefined
	console.log(arguments[1]); // 2
}
course('xxx');

****************************************************************
// js 模块导出
let yuzhu = 'cq';
function getMsg(msg) {
	console.log('i\'m ' + msg);
}
// export {yuzhu, getMsg};
// 另一种方法
export default {
	yuzhu: yuzhu,
	getMsg: getMsg
};

/****************************************************************/

你可能感兴趣的:(web前端)