摘要:也就是说这个外部函数的作用域就是闭包本身。无论通过何种手段直接或间接将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会使用闭包。
以下是个人对这三个老大难的总结(最近一直在学习原生JS,翻了不少书,不少文档,虽然还是新手,但我会继续坚持走我自己的路)
原型链所有对象都是基于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绑定规则有4点:按优先级1到4判断
由new调用?绑定到新创建的空对象;
由call、apply、bind调用?绑定到指定的参数对象;如foo.call(obj)
由上下文对象调用?绑定到这个上下文对象;如obj.foo()
默认情况下绑定到全局对象,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(); }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/80487.html
摘要:函数式编程前端掘金引言面向对象编程一直以来都是中的主导范式。函数式编程是一种强调减少对程序外部状态产生改变的方式。 JavaScript 函数式编程 - 前端 - 掘金引言 面向对象编程一直以来都是JavaScript中的主导范式。JavaScript作为一门多范式编程语言,然而,近几年,函数式编程越来越多得受到开发者的青睐。函数式编程是一种强调减少对程序外部状态产生改变的方式。因此,...
摘要:走在前端的大道上本篇是一篇文章带你理解原型和原型链一篇文章带你完全理解的查漏补缺,会不断丰富提炼总结更新。 走在前端的大道上 本篇是 一篇文章带你理解原型和原型链 、一篇文章带你完全理解this的查漏补缺,会不断丰富提炼总结更新。 什么是原型链 原型链 是针对构造函数的,比如我先创建了一个函数,然后通过一个变量new了这个函数,那么这个被new出来的函数就会继承创建出来的那个函数的属性...
摘要:因为一旦代码丢出来了,还会涉及到继承,构造函数,原型链,闭包等一系列问题在后面等着你,面试管为了掏你的底细会一问再问,问到你懵逼。不可以当作构造函数,也就是说,不可以使用命令,否则会抛出一个错误。 上一篇2018年3月面试心得《跨域问题》 话说我在面试的时候,有那么几天,不知道是中了什么邪,面试的几家公司开始疯狂的问我this,各种的this,绕着弯的问我this,后来我做梦都是thi...
阅读 1180·2021-11-24 09:39
阅读 2097·2021-11-22 13:54
阅读 2026·2021-09-08 10:45
阅读 1414·2021-08-09 13:43
阅读 2958·2019-08-30 15:52
阅读 3048·2019-08-29 15:38
阅读 2820·2019-08-26 13:44
阅读 3016·2019-08-26 13:30