几句话带你理解JS中的this、闭包、原型链

 更新时间:2016年09月26日 09:48:09   作者:苏福  
在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(); }

相关文章

  • js 转义字符及URI编码详解

    js 转义字符及URI编码详解

    本文主要介绍了转义字符及URI编码的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 微信小程序:数据存储、传值、取值详解

    微信小程序:数据存储、传值、取值详解

    这篇文章主要介绍了微信小程序:数据存储、传值、取值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • JS构造一个html文本内容成文件流形式发送到后台

    JS构造一个html文本内容成文件流形式发送到后台

    本文通过实例代码给大家介绍了JS构造一个html文本内容成文件流形式发送到后台的相关资料,需要的朋友可以参考下
    2018-07-07
  • javascript的document中的动态添加标签实现方法

    javascript的document中的动态添加标签实现方法

    下面小编就为大家带来一篇浅谈javascript的document中的动态添加标签实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • js 将线性数据转为树形的示例代码

    js 将线性数据转为树形的示例代码

    这篇文章主要介绍了js 将线性数据转为树形的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • JS创建对象几种不同方法详解

    JS创建对象几种不同方法详解

    这篇文章主要为大家详细介绍了javascript创建对象的几种不同方法
    2016-03-03
  • 理解javascript函数式编程中的闭包(closure)

    理解javascript函数式编程中的闭包(closure)

    这篇文章主要帮助大家理解javascript函数式编程中的闭包(closure)概念,通俗地讲, JavaScript 中每个的函数都是一个闭包,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • js对象数组和对象的使用实例详解

    js对象数组和对象的使用实例详解

    在本篇文章里小编给大家整理了关于js对象数组和对象的使用实例相关知识点,有需要的朋友们学习下。
    2019-08-08
  • JS如何监听div的resize事件详解

    JS如何监听div的resize事件详解

    这篇文章主要给大家介绍了关于JS如何监听div的resize事件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • JavaScript之iterable_动力节点Java学院整理

    JavaScript之iterable_动力节点Java学院整理

    这篇文章主要介绍了JavaScript之iterable,遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型
    2017-06-06

最新评论