Javascript中最令人困惑的行动、提升和关闭知识范围(推荐)

Javascript中最令人困惑的行动、提升和关闭知识范围(推荐)
1。功能
1。功能域
作用域在一个函数中,并且所有属于这个函数的变量都可以在整个函数的范围内被使用和重用。

函数(a){
var b=2;
函数条(){

}
var=3;
}
(bar);失败
console.log(A,B,C); / /三都失败了
函数上面的几个标识符和函数外部的访问将是false。
2。立即执行函数表达式
将包函数添加到任意代码片段中可以隐藏内部变量和函数定义,外部范围不能访问包函数中的任何内容。
例如,一些标识符,如bar,a,等等,这样可以保护变量不受污染。
编写插件时,通常使用函数表达式的立即执行,以保护内部变量。

var a=2;
(函数富(){
var a=3;
console.log(一); / / 3
});
console.log(一); / / 2
函数的第一个()将函数转换为表达式,第二个()执行函数。
有一个专门的术语:生活,表示函数表达的立即执行(立即调用函数表达式);
1。高级用法是将它们称为函数,并将参数传递给

(功能生活(全球){)
var a=3;
console.log(一); / / 3
console.log(全球的); / / 2
}(窗口);
2。更改的使用是倒装代码的顺序,这在CMD或AMD项目中被广泛使用。

(功能生活(工厂){)
工厂(窗口);
}(函数DEF(全局){
var a=3;
console.log(一); / / 3
console.log(全球的); / / 2
});
二、区块范围
Javascript不支持块作用域。

对于(var i = 0;i < 10;i + +){
console.log(我);
}
上面代码中的i等价于以下内容

var i;
为(i = 0;i < 10;i++){
console.log(我);
}
但也有例外,尝试catch,catch是块作用域。

尝试{
(未定义的);执行非法操作强制异常。
}
捕捉(错误){
console.log(ERR); / /正常运行
}
console.log(ERR); / / referenceerror:错误未找到
6改变现状,介绍了一种新的让关键词,并让关键词可以绑定变量的任何自己的范围(通常为{,})。换句话说,这让变域是隐含在其声明的变量。

三。促销
函数作用域和块作用域的作用是相同的。可以概括如下:在范围中的任何变量声明都会附加到这个范围。
1)编译与执行
变量和函数的所有声明在执行任何代码之前首先进行处理,您可以看到下面的代码示例。

a = 2;
VaR;
console.log(一); / / 2
代码的这一部分相当于:

var语句在编译阶段。
a = 2;将在执行阶段留下适当的分配语句。
console.log(一);
2)功能优先级
函数首先被提升,然后是变量。

(1);
变量Foo;
函数(){
(1)console.log;
}
函数(){
(2)console.log;
};
var函数表达式,尽管出现在函数()的声明之前,是一个重复语句(因此被忽略),因为函数声明被提升为普通变量。
上面的代码相当于:

函数(){
(1)console.log;
}
(1);
函数(){
(2)console.log;
};
四。关闭
闭包是一个函数,它有权访问另一个函数作用域中的变量,而创建闭包最常用的方法是在一个函数中创建另一个函数。

使用另一个函数访问函数的局部变量,闭包可以用来突破函数链域,并将函数内部的变量和方法传递到外部。

封闭性:
1的内嵌套函数。功能

2。内部函数可以引用外层的参数和变量。

三.垃圾回收机制不会回收参数和变量。

1)定义
当函数可以记住和访问函数的范围时,即使函数在当前范围之外执行,也会生成闭包。

函数(){
var a=2;
函数条(){
console.log(一);
}
回来吧;
}
Var Baz = foo();
Baz(2); / / -这是封闭作用。
1。分配功能栏,Baz,执行Baz,和目前的范围不在酒吧的范围,但可以执行。
2。关闭防止垃圾收集,和内部的范围仍然存在当Foo结束。这可以由巴兹。
2)将函数作为参数传递。

函数(){
var a=2;
函数的Baz(){
console.log(一); / / 2
}
酒吧(Baz);
}
函数条(FN){
(FN);这是闭包!
}
内部函数的Baz传吧。当调用内部函数(FN)时,可以观察到()内部范围的闭包,因为它可以访问A。
如果将函数作为第一类值类型并传递给它,您将看到闭包在这些函数中的应用。
在计时器、事件侦听器、Ajax请求、交叉窗口通信、Web工作者或任何其他异步(或同步任务中,只要使用回调函数,它实际上是使用闭包。
3)循环与关闭

对于(var i = 1;i < 5;i + +){
setTimeout(功能定时器(){)
console.log(我);
},我* 1000);
}
每次打印时,都是6,延迟函数的回调在循环结束时执行。
根据范围的工作原理,实际情况是,虽然循环中的五个函数在每次迭代中都定义,但它们都被封闭在一个共享的全局范围内,所以实际上只有一个函数I。
现在每次使用闭包打印不同的i。

对于(var i = 1;i < 5;i++){
函数(j){
setTimeout(功能定时器(){)
console.log(J);
},j * 1000);
})(一);
}
生活创造了一个范围,申报和执行功能在setTimeout回调马上可以记住当前的范围和参数J在各自的范围是不同的。
以上是Javascript中最令人困惑的范围、提升和关闭知识,我想帮助您。如果你有任何问题,请给我留言。萧边会及时回复你。谢谢你的支持网站
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部