闭包 (Closure)

定义:

a function use a variable outside the scope are closures.

 或者说

"Closures are FUNCTIONS WITH PRESERVED DATA"

 

 

 

console.dir()

Displays an interactive(交互式) list of the properties of the specified JavaScript object. 

syntax:console.dir(object);

 

 

var addTo = function(passed) {

       var inner = 2;

       return passed + inner;

};

console.log(addTo(3));

//5

 

in Javascript:, you can do this without passing variables:

 

example1:

 

var passed = 3;

var addTo = function(){

    var inner = 2;

    return passed + inner;

};

console.log(addTo(3));

 

This is a closure.

JS use lexical scoping. means inner variables is not accessible outside but  anything defined outside is automatically avaliable inside the function.

 

定义:

a function use a variable outside the scope are closures.

 

 

function is also object in  javascript,so in Chrome, console.dir(addTo(3))

 

 

 example2:

 

var addTo = function(passed){

          var add = function(inner){

            return passed + inner;

          };

           return add;

};

 

console.dir(addTo(3));

 

var addFour = new addTo(4);

 

console.dir(addFour);

 

 

console.log(addFour(2))

...

 

 

在中国的面试中一般会提到下面这种闭包有的变态用法:

 

function fun(){

var x = 1;

return function(){

   x++;

  console.log(x);

}

}

 

var a = fun();

a();

a();

a();

...这种用法演示了闭包的一种作用——在函数外面对函数内变量进行操作..

 

还有一种用法就是在for()循环中如果嵌套了异步事件。

for(let i = 0; i<10 ;i++)

{

setTimetou(()=>{console.log(i)},0);

}

这样打印出10个10,

如果改成

for(let i =0;i<10;i++)

{

(function()

{

setTimeout(()=>{console.log(i)})

})()

}

也就是说在setTimeout外面加了个函数,函数会向外面寻找这个i变量,这时其实形成了一个闭包。

 

 

 

 

"FUNCTIONS WITH PRESERVED DATA“

    

那么问一下,如果我们打印 console.dir(a)

在Chrome控制台中Closure是谁呢?

当然是fun函数啦

 

不信我们打印看一下:

这个函数中保留了数据x,

最后再来看一下文章最开头最原始的定义

"FUNCTIONS WITH PRESERVED DATA“

保留了数据的函数。

 

 

WIKI上闭包的定义:

直译过来:

 闭包是一个函数 这个函数的非本地变量被绑定关联到value(或者理解为 这个函数的内部变量和外部变量关联起来了)( 这个函数引用了外部的变量)

 

转载于:https://www.cnblogs.com/eret9616/p/8994159.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LR(0)分析法是一种自下而上的语法分析方法,它使用叫做LR(0)项目集的数据结构来表示文法的状态集合。可以使用Java语言来构造识别活前缀的DFA,以下是LR(0)项目集规范族的构造过程: 1. 对于文法的每一个产生式,构造一个初始LR(0)项目集,包含该产生式的一个项。项的形式为"A -> a .Bb",表示在该产生式中,已经识别了a,接下来要识别的是B,b是B之后的符号串。"."表示当前正在识别的位置。 2. 对于每个初始LR(0)项目集,使用闭包操作构造出它的闭包CLOSURE。闭包CLOSURE是指包含该项目集中所有可能的项和它们的后继符号的LR(0)项目集。具体来说,对于每个项"A -> a .Bb",找到所有可能的B产生式,生成新的项"B -> .c",其中c是B的一个后继符号。将这些新的项加入到闭包CLOSURE中,直到没有新的项可以加入。 3. 对于每个闭包CLOSURE,使用GO函数来构造它的转移函数。GO函数是指将一个LR(0)项目集和一个符号作为参数,返回一个新的LR(0)项目集,表示在该项目集中识别该符号之后的状态。具体来说,对于每个项"A -> a .Bb",如果B是该符号,则生成新的项"A -> aB .b"并加入到新的项目集中。 4. 重复步骤2和步骤3,直到没有新的LR(0)项目集可以生成为止。这样就构造出了LR(0)项目集规范族。 最终,可以使用DFA来表示LR(0)项目集规范族,并且可以使用该DFA进行语法分析。具体来说,从起始状态开始,每次读入一个符号,根据转移函数转移到下一个状态,直到达到接受状态或者出错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值