你所不知道的js

11 篇文章 0 订阅
  • 函数作用域和块作用域

块作用域中的let,可以更好的进行垃圾回收。

function process(data){......}
/*
var someData={..};
process(someData);  原申明方式,如果在click函数形成了一个覆盖整个作用域的闭包的情况下,js可能不会释放process的数据结构
*/
{
	let someData={..};
	process(someData); 
}  //在这个块中定义的内容完事可以销毁,为变量显式声明块作用域,并对变量进行本地绑定
var btn=document.getElementById("button");
btn.addEventListener("click",function click(event){
	......
})

在提升这部分中,函数声明(function foo(){})会被提升,但是函数表达式(var foo=function (){})不会

  • 闭包与循环
    常见的例子是在一个循环中延迟打印 i 的值,i的值递增,在常见的写法中由于延迟函数的回调会在循环结束时执行,所以要有改进方案。
//第一个解决方案就是将判断中的i定义由var变为let
for(let i=0;i<10;i++){
	setTimeout(function timer(){
		console.log(i);
	},i*1000);
}
//第二个方案是在不改变var定义的基础上,建立延迟函数的立即执行的闭包作用域,但是要注意这个作用域不能为空
for(var i=0;i<10;i++){
	(function (){
		var j=i;
		setTimeout(function timer(){
			console.log(j);
		},j*1000);
	})();
}
  • this 解析

this是在运行时进行绑定的,并不是在编写时绑定的,它的上下文取决于函数调用时的各种条件

//这段代码完美地展示了 this多么容易误导人
function foo(){
	var a=2;
	this.bar();
}
function bar(){
	console.log(this.a);
}
foo();//a is not defined

a是函数的私有变量,不可能在this是全局作用域的情况下被打印出来
this的绑定规则有四种:

  1. 默认绑定——绑定全局对象,在全局作用域中var a=2;
  2. 隐式绑定——当函数被引用的地方有上下文对象时,此规则会将函数绑定到这对象上,例如:var obj={functionA:functiona},调用时 obj.functionA;

隐式丢失:在隐式绑定中,被绑定的函数会丢失绑定对象,比如 var functionB=obj.functionA,此时其实是将函数A本身传给了B,A中的this不再绑定obj对象,而是B的上下文对象。

  1. 显示绑定——call和apply
  2. new绑定 *** ——优先级最高,先创建一个全新的对象,这个对象会被执行[[Prototype]]连接,这个新对象会被绑定到函数调用的this,如果函数没有返回其他对象,那么new表达式中的函数调用会返回这个新对象。
  • 对象
    分为六种语言类型:string,number,boolean,null,undefined,object

在对象中,可以通过属性访问obj. 和键访问obj[""]来访问值,其中的属性名永远是字符串,如果使用除string以外的值作为属性名,将会把它转换成字符串,数组下标使用数字,对象属性名的数字会被转换成字符串。
在数组(也是对象)中,如果你试图添加的属性看起来像数字,那它会变成数组下标进而修改数组内容。

js中有一些对象子类型,通常称为内置对象:		String,Number,Boolean,Object,Function,Array,Date,RegExp,Error
  • 原型
    1.原型构造函数实例之间的关系:每个构造函数都有一个属性(prototype)指向一个原型对象,这个原型对象有一个属性(constructor)指向构造函数,实例通过构造函数创建,实例和构造函数的原型指向同一个原型对象。
    2.在下面这张图中,所有的对象都是由js的内置函数Object构造出来的,所以SuperType.prototype指向Object的原型对象,而第二个是通过SubType.prototype=new SuperType();创建的,第三个是由var instance=new SubType()创建的。

事实上2中的第二个还是有副作用,在ES6之前可以使用SubType.prototype=Object.create(SuperType.prototype),在ES6之后可使用Object.setPrototypeOf(SubType.prototype=,SuperType.prototype)

在这里插入图片描述
3.准确来讲,js中的继承是指,在两个对象之间创建关联,这样一个对象就可以通过委托访问另一个对象的函数和属性。
4.构造函数。其实构造函数和程序中其他的函数没有不一样,构造函数也是普通的函数,只是它在被调用的前面加上了new关键字以后,就会把这个函数变成一个“构造函数调用”
5.检查一个实例的继承祖先通常被称为内省(或反射)。

//有两种方法进行检查
	function Foo(){
	}
	var a=new Foo();
	//1: 在a的整条原型链中是否存在Foo.prototype指向的对象
	a instanceof Foo;//true
	//2: 在a的整条原型链中是否出现过Foo.prototype
	Foo.prototype.isPrototypeOf(a);//true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值