这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
在 javascript 前端开发阶段经常会遇到 this,闭包,原型链知识,那么大家对这三种的基本知识理解吗?今天小编就带领大家一起学习 this,闭包,原型链的知识,感兴趣的朋友一起看看吧
原型链
所有对象都是基于 Object.prototype,Object.prototype 就是 JavaScript 的根对象,在 Object.prototype 中定义的方法都可以被其它对象访问到,当然也可以被重写了,所以直接在 Object.prototype 上调用的是原始功能的 toString()方法,该方法会放回参数对象的内置属性 [[class]] 的值,这个值是个字符串,比如'[Object String]'
要理解原型链机制的话,首先得知道根本原因:JavaScript 中的对象都有一个内置属性 [[Prototype]],这个属性和非标准的__proto__属性一样,__proto__在 ES6 中被纳入标准了,可以说它们基本上是等价的,但内置属性是无法访问到的。对象之间通过内置属性[[Prototype]] 关联了起来就形成了原型链,而原型链的顶层就是根对象 Object.prototype,Object.prototype 的原型将是 null,即 Object.prototype.__proto__ === null;
例如:
在访问对象的属性的时候,如:obj.a,首先查找自身,没有,就到它的内置属性 [[Prototype]] 所引用的对象上找,还是没有,就继续在这个上层对象的内置属性 [[Prototype]] 所引用的对象上找,一直找到根对象 Object.prototype,找不到就返回 undefined;
this
理解 this 的第一步就是要明白:this 既不指向函数自身,也不指向函数的词法作用域;
this 是在运行时进行绑定的,而不是在编写时绑定,它的上下文取决于函数调用时的各种条件;
this 的绑定和函数声明的位置没有任何关系,只取决于函数的调用位置和调用方式;
this 绑定规则有 4 点:按优先级 1 到 4 判断
1. 由 new 调用?绑定到新创建的空对象;
2. 由 call、apply、bind 调用?绑定到指定的参数对象;如 foo.call(obj)
3. 由上下文对象调用?绑定到这个上下文对象;如 obj.foo()
4. 默认情况下绑定到全局对象,foo();在严格模式下绑定到 undefined;
闭包
- function foo(){
- var a = 2;
- function bar(){}
- return bar;
- }
- var a = foo();
- a();
闭包:不是指函数 bar 也不是 a,它是一个引用,这个引用被内部函数 bar 持有,这个引用指向外部函数 foo 的整个作用域,它使得这个作用域即使在外部函数 foo() 执行后也不会被垃圾回收器回收。也就是说这个外部函数 foo 的作用域就是闭包本身。 无论通过何种手段(直接或间接)将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会使用闭包。
- var fn; //间接传递函数
- function foo() {
- var a = 2;
- function baz() {
- console.log(a);
- }
- fn = baz;
- }
- function bar() {
- fn();
- }
- foo();
- bar();
- function foo() {
- var a = 2;
- function baz() {
- console.log(a);
- }
- bar(baz);
- }
- function bar(fn) {
- fn();
- }
来源: http://www.phperz.com/article/17/0517/331584.html