二十三.变量的作用域

96 阅读2分钟

变量作用域

变量的作用域(scope) 是程序源代码中定义这个变量的区域,变量在这个区域中能够被使用。

作用域分为全局作用域和函数作用域(又叫局部作用域)两种。

全局作用域

全局作用域是最外围的一个执行环境,在web浏览器中,全局执行环境被认为是window对象。所有全局变量和全局函数都是作为window对象的属性和方法创建的。全局变量拥有全局作用域,全局作用域直到应用程序退出例如关闭网页或浏览器时才会被销毁。

JS中声明的全局变量是全局对象的属性; 函数体内不使用var声明而直接赋值的变量当做全局变量。

image.png

image.png

局部作用域

在函数内(var声明)的变量只在函数体内有定义。它们是局部变量只能在函数内部使用外部不能使用的变量,作用域是局部性的。函数参数也是局部变量,它们只在函数体内有定义。函数作用域中的所有代码执行完毕后,该作用域被销毁,保存在其中的所有变量和函数定义也随之销毁。

变量作用域访问规则

在ES5中,函数的代码块内部的代码可以访问形参变量也可以访问外部的变量(全局变量),采用就近优先原则。函数外面的代码不能直接访问函数内部的变量。

image.png

image.png

image.png

image.png

函数实参传入基本数据和引用数据的区别

函数的实参是先取值再传给函数的形参。

基本数据

image.png

image.png

函数中改变的是n的值而并非obj.name中的值,obj.name为一个基本数据,是obj的一个属性。则取值时就是取到的一个字符串。

引用数据

image.png

image.png

此时n引用的是obj对象的内存空间,即n和obj都指向同一个内存空间,n.name并没有修改n的值只是修改了引用对象的内部的name属性值,则n.name=obj.name。

image.png

image.png

最初n引用的是obj对象的内存空间,即n和obj都指向同一个内存空间,而n={name:"jzx"}修改了n的值,重新指向内存空间中另一个对象的引用地址。