当前位置:首页 » 文件传输 » 闭包外部可以访问内部变量吗
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

闭包外部可以访问内部变量吗

发布时间: 2022-09-24 06:06:42

A. js 闭包原理

1、闭包的概念:指有权访问另一个函数作用域中的变量的函数,一般情况就是在一个函数中包含另一个函数。

2、闭包的作用:访问函数内部变量、保持函数在环境中一直存在,不会被垃圾回收机制处理

因为函数内部声明 的变量是局部的,只能在函数内部访问到,但是函数外部的变量是对函数内部可见的,这就是作用域链的特点了。

子级可以向父级查找变量,逐级查找,找到为止

因此我们可以在函数内部再创建一个函数,这样对内部的函数来说,外层函数的变量都是可见的,然后我们就可以访问到他的变量了。

3、闭包的优点:

方便调用上下文中声明的局部变量
逻辑紧密,可以在一个函数中再创建个函数,避免了传参的问题
4、闭包的缺点:

因为使用闭包,可以使函数在执行完后不被销毁,保留在内存中,如果大量使用闭包就会造成内存泄露,内存消耗很大

B. 谁来解释一下Javascript闭包的概念

闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。"闭包" 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。


简而言之,闭包的作用就是在函数执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回函数所占用的资源,因为函数的内部函数的执行需要依赖函数中的变量。

一个闭包的实例:

functionCounter(start){
varcount=start;
return{
increment:function(){
count++;
},
get:function(){
returncount;
}
}
}
varfoo=Counter(4);
foo.increment();
foo.get();//5

C. js中作用域,闭包问题

这篇文章主要介绍了JavaScript中的作用域和闭包问题,是JS入门学习中的基础知识,需要的朋友可以参考下
JavaScript的作用域以函数为界,不同的函数拥有相对独立的作用域。函数内部可以声明和访问全局变量,也可以声明局部变量(使用var关键字,函数的参数也是局部变量),但函数外部无法访问内部的局部变量:
function test() {
var a = 0; // 局部变量
b = 1; // 全局变量
}
a = ?, b = ? // a为undefined,b为1
同名的局部变量会覆盖全局变量,但本质上它们是两个独立的变量,一方发生变化不会影响另一方:
a = 5; // 函数外a的值为5
function test() {
var a = 4; // 函数内a的值为4
}();
a = ? // 函数外a的值仍为5,不受函数影响
一般而言,函数结束后,对函数内部变量的引用全部结束,函数内的局部变量将被回收,函数的执行环境将被清空,但是,如果以内部函数作为函数的返回结果,情况就会发生变化:
function test(i) {
var b = i * i;
return function() {
return b--;
};
}
var a = test(8);
a(); // 返回值为64, 内部变量b为63
a(); // 返回值为63, 内部变量b为62
当以内部函数作为返回值时,因为函数结束后内部变量的引用并未结束,所以函数的局部变量无法回收,函数的执行环境被保留下来,因而形成了闭包效果,可以通过该引用访问本该被回收的内部变量。
闭包还使得函数的局部变量成为“私有”变量,只能通过返回的内部函数访问,而无法通过其他任何手段去改变。
因此,闭包可用于维持局部变量和保护变量。
不使用闭包的情况:
var a = []; // 假设a中包含5个元素
for (var i = 0, m = a.length; i < m; i++) {
a[i].onclick = function(e) {
return 'No. ' + i;
};
}
// 点击任何一个元素,返回值都是“No. 5”,因为i最后的值

D. 如何理解闭包

定义和用法:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返 回的这个函数在外部被执行,就产生了闭包。 2、表现形式:使函数外部能够调用函数内部定义的变量。 3...

E. PHP有办法在闭包外部得到闭包内部的变量吗

php 有闭包函数么?好像么有吧,你可能是想问以下两种情况
一。外部访问类的私有变量,可以使用 __get()方法
class test{
private $b = 10;
function __get($name){
return $this->$name;
}
}
$a = new test();
echo $a->b;
二.方法内部访问全局变量 可以使用global 关键字
$b = 10;
function test(){
global $b;
echo $b;
}

F. JavaScript中的闭包是用来做什么的

闭包有两个作用,一是外部可以读取函数内部的变量

functionf1(){
n=999;
functionf2(){
alert(n);
}
returnf2;
}
varresult=f1();
result();//999

另一个就是让这些变量的值始终保持在内存中

functionf1(){
varn=999;
nAdd=function(){n+=1}
functionf2(){
alert(n);
}
returnf2;
}
varresult=f1();
result();//999
nAdd();
result();//1000

在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。

为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

这段代码中另一个值得注意的地方,就是“nAdd=function(){n+=1}”这一行,首先在nAdd前面没有使用var关键字,因此 nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个

匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。

其应用场景就是:

  1. 函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。

  2. 在内存中维持一个变量

  3. 通过保护变量的安全实现JS私有属性和私有方法(不能被外部访问)

  4. 私有属性和方法在Constructor外是无法被访问的

G. PHP有办法在闭包外部得到闭包内部的变量吗

这个方法很多的,最简单的就是在类里面声明一个变量,然后再闭包内部把变量指定给这个类变量就可以了,还有可以借助数据库、session以及缓存等等。

H. 函数外部有age=12,内部函数能不能访问到

谈到JavaScript的闭包必然离不开作用域。在javascript里,作用域分为全局作用域(在任何地方都能访问)和局部作用域(在指定的代码片段内能访问)。

1、局部作用域通常是函数内部作用域,在函数外部是无法直接访问函数内部定义的局部变量。看如下代码:

function fun () {

var age = 18;

}

console.log(age) //Uncaught ReferenceError: age is not defined 报错,age未定义

由此可见,在fun函数外部是无法访问函数fun内部的age变量的

2、闭包则提供了一种在局部作用域外访问局部作用域内部变量的途径。看如下代码:

function fun () {

var age = 18;

function getAge () {

age++
return age

}

return getAge

}

var foo = fun()

console.log(foo()) //19 第一次运算的结果

console.log(foo()) //20 age并没有被回收,一直存在,所以第二次运算是:19++则是20,而不是重新定义age=18
console.log(foo()) //21 age并没有被回收,一直存在,所以第三次运算是:20++则是21,而不是重新定义age=18
我们在函数fun外部成功的获取到了函数fun内部的局部变量age。可以看出,fun函数的返回值是一个调用了局部变量age的函数getAge,那么在fun外部调用fun时能得到fun函数的内部函数getAge,而这个内部函数getAge是可以访问fun内部的局部变量age的,所以我们能够在函数fun外访问到age。由于函数fun可在对应的作用域内调用,且调用时需要访问它内部的局部变量age,所以fun内部的age需要一直存在,直到fun被回收。

3、闭包的应用场景

a、由于函数fun内部的age变量会一直存在,那么可以用来做变量值的长期保存。

b、当某些变量需要限制访问权限,做变量保护时,就可以使用闭包,提供指定的访问接口访问变量。

I. 初学js,一个很简单的问题,为什么函数外访问不到函数内的全局变量

原因如下:

1、函数里面的变量不是全局变量,函数内部声明的变量一定是局部变量,所以想要外部访问是无法直接访问到的,请规范全局变量和局部变量的定义。

2、外部想要访问函数内的变量可以采用闭包来实现,代码实例如下:

functiontest(){
varx=10;
returnfunction(){
returnx;
}
}
//调用局部变量x,报错未定义
alert(x);
//调用
vara=test();
alert(a());

这样可以实现外部访问内部变量。