js:深入闭包(作用域)

/**

* 闭包的作用域

*/

fn1(); //fn1 能够执行,不会报错,对于通过function func_name()这种写法来定义的函数,永远都会被最先初始化。

function fn1(){

console.log("fn1");

}

fn2(); //报错:fn2 is not a function

/**

*使用如下方式定义函数,不会被先执行,如果在定义之前调用,报错。

*这种函数的定义方式是先在内存中创建一块区域,之后通过一个fn2的变量指向这块区域,

*这块区域的函数开始时是没有名称的,这种函数名称叫做匿名函数。

*/

var fn2 = function(){

console.log("fn2");

}

----------------------------------函数作用域--------------------------------------

/**

* 在js中当进行函数调用时,会为每一个函数增加一个属性scope,通过这个属性来指向一块内存,

* 这块内存中包含有所有的上下文使用的变量,当在某个函数中调用了新函数之后,新函数依然会有

* 一个作用域来指向原有的函数的scope和自己新增加的scope,这样就形成了一个链式结构,

* 这就是js中的作用域链。

*/

var color = "red";

var showColor = function(){

console.log(this.color);

}

function changeColor(){

var anotherColor = "blue";

function swapColor(){

var tempColor = anotherColor;

anotherColor = color;

color = tempColor;

}

swapColor();

}

changeColor();

showColor(); //blue

执行步骤:

释放swapColor

释放changeColor

执行showColor

--------------------------------------------------------------------------

var name = "one";

var object = {

name:"two",

getName:function(){

//var name = "three";

return function(){

return this.name;

//return name;

};

}

};

console.log(object.getName()()); //one

想想问什么?若是在getName函数里再加个 var name = "three" 呢?若把匿名函数里的 return this.name; 改为 return name; 呢?

返回值是什么,为什么?

如果你能理解上面代码的运行结果,应该就算理解闭包的运行机制了。

/**

* 使用闭包虽然可以演唱作用域,但是也会占用过多的内存,一般非特殊情况下不要使用闭包。

*

*/

js:深入闭包(作用域),布布扣,bubuko.com

时间: 2024-10-14 05:38:52

js:深入闭包(作用域)的相关文章

JS中的作用域和闭包

作用域:在编程语言中,作用域控制着变量与参数的可见性及生命周期.JS确实有函数作用域,那意味着定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的. var a = 1; var fs = function (){ var b = 2; var c = 4 var fun = function (){ var c = 3; alert(a) //输出1 alert(b) //输出2 alert(c) //输出3 } fun(); } f

js:深入闭包(作用域:下)

函数功能:该函数将一个字符串转为字形下标的数组.此函数可用来确定一种字体里是否存在某个字形 控制台下代码: #include "stdafx.h" #include <windows.h> #include"stdio.h" void main() { char ch[] = {'0'}; WORD chnl[20] = {0}; HDC hdc; hdc = GetWindowDC(0); int n = GetGlyphIndicesA(hdc,ch

JS详细图解作用域链与闭包

JS详细图解作用域链与闭包 攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你是初入前端的朋友,我没有办法直观的告诉你闭包在实际开发中的无处不在,但是我可以告诉你,前端面试,必问闭包.面试官们常常用对闭包的了解程度来判定面试者的基础水平,保守估计,10个前端面试者,至少5个都死在闭包上. 可是为什么,闭包如此重要,还是有那么多人没有搞清楚呢?是因为大家不愿意学习吗?还真不是,

理解js中的作用域以及初探闭包

前言 对于js中的闭包,无论是老司机还是小白,我想,见得不能再多了,然而有时三言两语却很难说得明白,反正在我初学时是这样的,脑子里虽有概念,但是却道不出个所以然来,在面试中经常会被用来吊自己的胃口,考察基础,虽然网上自己也看过不少相关闭包的文章,帖子,但貌似这玩意,越看越复杂,满满逼格高,生涉难懂的专业词汇常常把自己带到沟里去了,越看越迷糊,其实终归结底,用杨绛先生的一句话就是:"你的问题在于代码写得太少,书读得不够多",其实在我看来前者是主要的,是后者的检验, 自知目标搬砖20年(还

【 js 基础 】作用域和闭包

一.编译过程 常见编译性语言,在程序代码执行之前会经历三个步骤,称为编译. 步骤一:分词或者词法分析 将由字符组成的字符串分解成有意义的代码块,这些代码块被称为词法单元. 例子: var a = 2; 这一句通常被分解成为下面这些词法单元:var .a . = .2.; . 步骤二:解析或者语法分析 将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树.这个树被称为"抽象语法树"(Abstract Syntax Tree, AST) 例子: var .a . =

JS之闭包

闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性: 1)作用域链 2)垃圾(内存)回收机制 3)函数嵌套...等等. 首先理解一下作用域链的含义,简单来说,作用域链就是函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引. 而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至全局对象为止. 当函数中需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量中先找,如果没有

JS的词法作用域

词法作用域定义实现的规则: 1 函数作用域实在定义的时候决定的,而不是在执行时候决定 2 为了实现这种词法作用域,函数内部不仅包含函数代码逻辑,还必须引用当前的作用域链. 3 函数对象可以通过作用域链相互关联起来,函数内部的变量都可以保存在函数作用域内. 变量作用域:变量的作用域是程序源代码中定义这个变量的区域. 1在函数内部,局部变量的优先级要高于同名的全局变量. 2 JS是函数作用域 3 函数作用域:变量在声明它的函数体内以及该函数内部嵌套的函数体内都有定义. 4 JS的函数作用域指的是:在

JS基础——闭包

有关JS中闭包的理解和使用. 一.简介 子函数可以使用父函数中的局部变量,这种行为就叫做闭包.通常指,有权访问另一个函数作用域中的变量的函数.创建时,通常在一个函数中创建另一个函数,通过另一个函数访问这个函数的局部变量. function box() { var user = 'Lee'; return function () { //通过匿名函数返回 box()局部变量 return user; }; } alert(box()()); 这里通过一个匿名函数来访问父函数中的user变量,并且返

详解js变量、作用域及内存

详解js变量.作用域及内存 来源:伯乐在线 作者:trigkit4 原文出处: trigkit4 基本类型值有:undefined,NUll,Boolean,Number和String,这些类型分别在内存中占有固定的大小空间,他们的值保存在栈空间,我们通过按值来访问的. JavaScript 1 2 (1)值类型:数值.布尔值.null.undefined. (2)引用类型:对象.数组.函数. 如果赋值的是引用类型的值,则必须在堆内存中为这个值分配空间.由于这种值的大小不固定(对象有很多属性和方