今天,我们来初步了解一下作用域和闭包的相关知识点,因为是初步了解,所有不会深入,不会太难,希望对大家有所帮助。
说白了,作用域就是一个代码区域,或者也可以理解成为一个运行环境。
JS中有两种作用域,全局作用域和函数作用域。
// window环境 var a = 123; var b = 234; var c = 456; //函数作用域 function A(){ var a = 123; var b = 234; var c = 456; } A();
全局作用域:直接在脚本中写代码,在全局作用域中声明得变量,会提升到脚本顶部,并成为window属性。(前几节中有涉及)
函数作用域:在函数中书写代码,声明的变量会提升到函数的顶部,不会成为全局属性,在函数内部声明的变量不会污染全局变量。
因此,在编程过程中,尽可能的将功能封装在函数中。
当函数成为一个表达式的时候,既不会提升,也不会污染全局变量。
将函数变成表达式的方法之一,就是用小括号就函数包裹起来。代码如下:
( function 函数名(){ 函数体; })
如此一来,这样的函数就无法通过函数名来调用了。
如果,函数作为表达式并且立即调用,这样的函数就被成为立即实行函数:
( function 函数名(){ 函数体; })(); ( function 函数名(){ 函数体; }());
调用的小括号可以在里也可以在外。
由于大部分情况下,函数的函数名不起作用,因此,立即执行函数一般不书写函数名,没有函数名的函数,称之为匿名函数。
在全局作用域下只能使用全局作用中声明的变量(包括函数)。
在函数作用域下,既可以使用函数作用域中声明的变量,也可以使用外部环境中声明的变量(包括函数)。
var a = 123; console.log(a);打印出来123 function A(){ console.log(a);//也可以打印出来123; var b = 234; } A(); console.log(b);//这里会报错,因为b未定义。
内部变量和外部变量冲突的时候,使用内部变量,在内部没有的情况下,依次向外层环境中找。
内部可以使用外部,但外部不可能使用内部的(你的就是我的,我的还是我的)。
从严格意义上来讲,闭包是一种现象。
闭包就是内部函数可以使用外部函数环境中的变量。
天就讲到这里,关于闭包的知识,后期会进行详细的解说。