相关阅读:谈谈我对JavaScript原型和闭包系列理解(随手笔记8) 谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
什么是闭包
闭包是什么?闭包是Closure,这是静态语言所不具有的一个新特性。但是闭包也不是什么复杂到不可理解的东西,简而言之,闭包就是:
• 闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。
• 闭包就是就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配
• 当在一个函数内定义另外一个函数就会产生闭包
什么是原型?
原型是一个对象,其他对象可以通过它实现属性继承。
任何一个对象都可以成为原型么?
是
哪些对象有原型
所有的对象在默认的情况下都有一个原型,因为原型本身也是对象,所以每个原型自身又有一个原型(只有一种例外,默认的对象原型在原型链的顶端).
执行上下文
每次当控制器转到ECMAScript可执行代码的时候,即会进入到一个执行上下文。
执行上下文(简称-EC)是一个抽象概念,ECMA-262标准用这个概念同可执行代码(executable code)概念进行区分。
标准规范没有从技术实现的角度准确定义EC的类型和结构;这应该是具体实现ECMAScript引擎时要考虑的问题。
活动的执行上下文在逻辑上组成一个堆栈。堆栈底部永远都是全局上下文(global context),堆栈顶部是当前(活动的)执行上下文。堆栈在EC类型的变量(various kingds of EC)被推入或弹出的同时被修改。
--------------------------------------------------------------------------------
情况一: 在一段js代码拿过来真正一句一句运行之前,浏览器已经做了一些“准备工作”,其中就包括对变量的声明,而不是赋值。变量赋值时在赋值语句执行的时候进行的。
情况二: 在“准备工作”阶段,this是直接赋值的。
console.log(this) //Window
情况三: 函数: 函数表达式和函数声明
console.log(f1); //function f1() {} function f1() {} //函数声明 console.log(f2); //undefined var f2 = function() {}; //函数表达式
“准备工作”总结:
•变量、函数表达式————变量声明,默认赋值为undefined
•this————赋值
•函数声明————赋值
这三种数据的准备情况我们称之为“执行上下文”或者“执行上下文环境”。
--------------------------------------------------------------------------------
javascript在执行一个代码段之前,都会进行这些“准备工作”来生成执行上下文。这个“代码段”分为三种情况--全局代码、函数代码、Eval代码。
//全局代码段 <script type="text/javascript"> //代码段... </script> //函数代码段 function fn(x) { console.log(x + 5); } var fn = new Function("x", "console.log(x + 5)"); //Eval代码段 eval('var x = 10'); (function foo() { eval('var y = 20'); })(); alert(x); //10 alert(y); //"y" is not defined //因为eval涉及到安全问题(脚本注入),所以尽量不用。
--------------------------------------------------------------------------------
在函数中,除了“准备工作”的几种情况,还会有其他数据
function fn(x) { console.log(arguments); //[10] conosole.log(x); //10 } fn(10);
以上代码展示了在函数体的语句执行之前,arguments变量和函数参数都已经被赋值。
函数每被调用一次,都会产生一个新的上下文执行环境。因为不同调用那个就可能产生不同的参数。
函数在定义的时候(不是调用)就已经确定了函数体内部自由变量的作用域。
var a = 10; function fn() { console.log(a); //a是自由变量 } //函数创建时,就确定了a要取值的作用域 function bar(f) { var a = 20; f(); //打印"10",而不是"20" } bar(fn);
总结:
全局代码的上下文环境数据内容为:
•普通变量(包括函数表达式),如:var a = 10 | ===> 声明(默认赋值undefined)
•函数声明,如function fn() {} | ===> 赋值
•this | ===> 赋值
函数体
•参数 | ===> 赋值
•arguments | ===> 赋值
•自由变量的取值作用域 | ====> 赋值
通俗的定义:
在执行代码之前,把将要用到的所有变量都事先拿出来,有的直接赋值了,有的先用undefined占个位。
以上内容是小编给大家分享的JavaScript原型和闭包系列理解(随手笔记6)的全部叙述,希望大家喜欢。
本文向大家介绍谈谈我对JavaScript原型和闭包系列理解(随手笔记8),包括了谈谈我对JavaScript原型和闭包系列理解(随手笔记8)的使用技巧和注意事项,需要的朋友参考一下 在上篇文章给大家介绍了《谈谈我对JavaScript原型和闭包系列理解(随手笔记6)》, 谈谈我对JavaScript原型和闭包系列理解(随手笔记9) 可以点击了解详情。 执行上下文栈 执行全局代码时,会产生
本文向大家介绍谈谈我对JavaScript原型和闭包系列理解(随手笔记9),包括了谈谈我对JavaScript原型和闭包系列理解(随手笔记9)的使用技巧和注意事项,需要的朋友参考一下 相关阅读:谈谈我对JavaScript原型和闭包系列理解(随手笔记6) 谈谈我对JavaScript原型和闭包系列理解(随手笔记8) 作用域 引用《JavaScript语言精粹和编程实践》上对作用域的定义: 变量
本文向大家介绍谈谈你对闭包的理解?相关面试题,主要包含被问及谈谈你对闭包的理解?时的应答技巧和注意事项,需要的朋友参考一下 说明: bar在foo函数的代码块中定义。我们称bar是foo的内部函数。 在bar的局部作用域中可以直接访问foo局部作用域中定义的m、n变量。 简单的说,这种内部函数可以使用外部函数变量的行为,就叫闭包。 闭包的意义与应用
本文向大家介绍小白谈谈对JS原型链的理解,包括了小白谈谈对JS原型链的理解的使用技巧和注意事项,需要的朋友参考一下 原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好。 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么。简单粗暴点看原型链吧,想点与代码无关的事,比如人、妖以及人妖。 1)人是人他妈生的,妖是妖他妈生的。人和妖
本文向大家介绍谈谈对JavaScript原生拖放的深入理解,包括了谈谈对JavaScript原生拖放的深入理解的使用技巧和注意事项,需要的朋友参考一下 前面的话 拖放(drag-and-drop,DnD)其实是两个动作——拖和放。所以,它涉及到两个元素。一个是被拖的元素,称为拖放源;另一个是要放的目标,称为拖放目标。本文将通过拆分这两个概念来详细介绍原生拖放 拖放源 什么样的元素才是拖放源
本文向大家介绍JavaScript闭包原理与用法学习笔记,包括了JavaScript闭包原理与用法学习笔记的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript闭包原理与用法。分享给大家供大家参考,具体如下: 闭包(Closure) 闭包是一个函数和词法环境的组合,函数声明在这个词法环境中。 词法作用域: 看下面的一个例子: init()创建了一个局部变量name和一个函数d