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中最令人困惑的范围、提升和关闭知识,我想帮助您。如果你有任何问题,请给我留言。萧边会及时回复你。谢谢你的支持
网站。