js的闭包和return理解 js闭包是什么,有什么好处
闭包 js 中的return是啥意思
如果要返回函数执行的结果那么首先要让这个函数执行,例如:
[code=”javascript”]
function makefunc(x) {
return (function (){
return x;
})();
}
alert(makefunc(0));
[/code]
这里有一个匿名函数。
[code=”javascript”]
(function (){
return x;
})();
[/code]
在第一个括号内是匿名函数,第二个括号用于调用该匿名函数,您可以在第二个括号中传入所需的参数。例如:
[code=”javascript”]
(function( x , y){
alert( x + y);
})(2 ,3 );
js的闭包和return理解 js闭包是什么,有什么好处
[/code]
js中闭包是什么意思,有什么作用,最好举例说明啊。
函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称之为“闭包”。
从技术角度讲,所有的JavaScript函数都是闭包: 它们都是对象,它们都关联到作用域链。
实现计数器
介绍利用闭包实现计数器,请看以下代码:
var counter = (function() {
var count = 0;
return function() {
return count ++;
}
})();
以上代码定义了一个立即执行的函数,count遍历只能在这个匿名函数中可以使用。
js中return的用法
定义:return 语句会终止函数的执行并返回函数的值。
js的闭包和return理解 js闭包是什么,有什么好处
根据return的定义,可以明确,return只会出现在函数中,否则将会报语法错误。
函数中如果存在循环语句,在循环语句中可以使用return,此时会跳出循环返回结果而不执行后面的循环操作。需要注意的是,return跳出循环的机制与break不同,break只会跳出单层循环,而return不管几层循环都会直接跳出所有循环,终止执行循环。
return 后面可以是基础数据类型,也可以是引用类型或函数,返回函数的用法可以用来实现闭包。
return 后不跟任何数据,返回的是undefined。
js闭包函数
使用闭包是为了更方便的复用函数,在函数式编程里面应用特别广泛,所以在javasript、scala等语言里面经常看到闭包的身影。
当然在java、go中也会用到,对于传递函数特别有用,java8中的lambda就是为了更方便的使用函数闭包,让定义函数和传递函数变得更为便捷和灵活,本质上还是编译成匿名内部类了。
在使用闭包的时候,需要注意自由变量,什么情况是值拷贝,什么情况是名称引用。
js中关于闭包的理解
闭包的概念
所谓的闭包就是利用作用域的嵌套,将原本的局部变量进化成私有变量,同时在作用域的外部能够拿到该变量的环境,就叫做闭包!
闭包的特点
1.比较消耗性能
2.避免了全局变量的污染
3.可以在外部操作内部的变量,方便 但是不安全
4.低版本浏览器会造成内存的泄露
5.将原本要删除的变量保存起来,方便下一次使用
闭包的原理
表现 :作用域的嵌套
本质 :函数的定义区域: 函数的定义作用域
函数的执行区域: 函数的执行作用域
关系 :执行时,可以拿到定义作用域的所有变量
像这种利用作用域嵌套,拿到内部变量的 环境,都可以看做成闭包。(利用作用域的嵌套,触发了计算机的垃圾回收机制,将原本要删除的变量临时保存到新的作用域中)
应用场景: 1.循环内绑定的事件 2. 事件处理函数 3.计时器
关于JS闭包和return的问题?
{increment,decrement,clear}
相当于
{"increment":increment,"decrement":decrement,"clear":clear}
当键名与变量名相同时,就可以用这种简略写法
let {increment,decrement,clear}=outer(); 则是ES6新增的对象的解构赋值方法,就是把对象中的各个属性分别赋值给同名的变量。
js闭包例子中的两次return各自起到什么作用
第一个return作用是返回立即执行函数(IIFE)的计算结果,即另一个function,返回的这个function赋值给了add变量。第二个return对应的就是你调add时会给你的返回值。
这里这么做的目的是利用闭包的特性隔离作用域,从而起到模拟局部变量的效果。
假如你不这么做,counter变量会被挂载到global作用域,浏览器端就是window对象上
怎么更好的理解JS闭包,希望举个例子,还有应用场景
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
Js代码
var n=999;
function f1(){
alert(n);
}
js的闭包和return理解 js闭包是什么,有什么好处
f1(); // 999
另一方面,在函数外部自然无法读取函数内的局部变量。
Js代码
function f1(){
var n=999;
}
alert(n); // error
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
Js代码
function f1(){
n=999;
}
f1();
alert(n); // 999
--------------------------------------------------------------------------------------------------------
二、如何从外部读取局部变量?
出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。
那就是在函数的内部,再定义一个函数。
Js代码
function f1(){
n=999;
function f2(){
alert(n); // 999
}
}
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1 就是不可见的。这就是Javascript语言特有的“链式作用域”结构(chain scope)。
子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
Js代码
function f1(){
n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
--------------------------------------------------------------------------------------------------------
三、闭包的概念
上一节代码中的f2函数,就是闭包。
各种专业文献上的“闭包”(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。