JS全局变量是全局对象的属性,函数局部变量为什么就不是函数的属性呢?

能不能详细阐述和解释一下,JS中 函数局部变量 与 函数属性 之间的关系以及区别。

局部变量和全局变量同名时,会隐藏这个全局变量;
4.变量
关键字: 4.变量
4.1 变量的类型
JS是松散类型的语言
4.2 变量的声明
var 声明是变量的标准声明
var 声明的变量是永久性的,不能用delete运算符删除

全局对象,调用对象初始化时,JS解析器会在相应的代码段里寻找var声明的变量,
然后在全局对象,调用对象中创建相应的属性,此时它是未赋值的(undefined),
当程序执行到相应的var声明代码段时才会给相应对象的属性赋值

重复的声明:根据以上var声明作用的理解,重复的var声明不会造成任何错误,
var声明只是方便创建全局对象,调用对象的属性,代码只是赋值用的

遗漏的声明:给未声明的变量赋值,JS会隐式声明全局变量(在全局对象中增加相应的属性),然后给其赋值
4.3 变量的作用域
全局变量,局部变量
局部变量和全局变量同名时,会隐藏这个全局变量
4.3.1 没有块级作用域
函数中声明的变量,无论在哪里声明的,在整个函数中它们都是有定义的
4.3.2 未声明的变量和未赋值的变量
alert(u);会产生一个错误--使用未声明的变量会产生一个错误
var u;alert(u);会跳出undefined---使用未赋值的变量,使用的它的默认值undefined

4.4 基本类型和引用类型
第三章已经讲过
4.5 垃圾收集
同java

4.6 作为属性的变量
4.6.1 全局对象
JS解释器开始运行时,在执行任何JS代码前,会创建一个全局对象,这个对象的属性就是JS全局变量,
并初始化为undefined
var声明一个JS全局变量时,实际上就是定义了一个全局对象的属性,

JS解释器还会用预定义的值和函数来初始化全局对象的许多属性,如:Infinity parseInt Math

非函数内部可以用this来引用这个全局对象

客户端的JS中,Window对象代表浏览器窗口,它包含该窗口中的所有JS代码的全局对象,具有自我引用的window属性
4.6.2 局部变量:调用对象
函数的局部变量存放在调用对象的属性
调用对象是一个完全独立的对象,所以可以防止覆盖同名的全局变量
4.6.3 JS的执行环境
JS解释器执行一个函数时,会创建一个执行环境
JS允许同时存在多个全局执行环境,如:JS客户端的ifame的情况

4.7 深入理解变量作用域
每个JS执行环境都有一个和它相关联的作用域链它是一个对象列表或对象链.
查询x:变量名解析(variable name resolution)的过程,它开始查看作用域链的每一个对象,
如果有,返回值,如果没有继续查询下一个对象,以些类推.
作用域链的优先级:嵌套函数的调用对象>调用对象>全局对象

根据以上理解说明JS初始化的过程:

在JS解释器执行任何代码之前,创建全局对象
用预定义的值和函数来初始化全局对象中的属性,eg.Math,Infinity,parseInt
搜索函数外的var声明,创建全局对象相应的属性,初始化为undefined
创建全局的执行环境,作用域链只有一个对象-全局对象
依次执行代码
遇到var声明赋值语句给全局对象相应的属性赋值
遇到未声明赋值语句,在全局对象中增加相应的属性,并赋值
遇到函数调用,创建调用对象
搜索函数中的var声明和参数,创建调用对象相应的属性,初始化为undefined
创建函数执行环境,作用域链--第一对象:调用对象;第二对象:全局对象
依次执行代码
遇到var声明赋值语句给调用对象相应的属性赋值
遇到未声明赋值语句,在全局对象中增加相应的属性,并赋值
遇到函数调用,创建嵌套函数的调用对象
搜索嵌套函数中的var声明和参数,创建嵌套函数的调用对象相应的属性,初始化为undefined
创建嵌套函数执行环境,作用域链--第一对象:嵌套函数的调用对象;第二对象:调用对象;第三对象:全局对象

依此类推

eg1.
var scope="global";
function f(){
alert(scope);
var scope="local";
alert(scope);
}
f();
过程:
创建全局对象,搜索函数外的var声明语句,在全局对象中创建scope属性,scope=undefined
创建全局的执行环境,作用域链只有一个对象:全局对象
依次执行代码:
var scope="global"时,变量名解析开始,在全局对象属性中查找scope属性
把"global"赋给scope
遇到函数调用:创建调用对象
搜索函数中的var声明语句和参数,在调用对象中创建scope的属性,scope=undefined
创建函数执行环境,作用域链:调用对象>全局对象
依次执行代码:
alert(scope),查询scope,变量名解析,先搜索调用对象,找到scope属性,其值为undefined,执行
var scope="local",查询scope,变量名解析,先搜索调用对象,找到scope属性,scope="local"
alert(scope),查询scope,变量名解析,先搜索调用对象,找到scope属性,其值为"local",执行

eg2.
var scope="global";
function f(){
alert(scope);
scope="local";
alert(scope);
}
f();
过程:
创建全局对象,搜索函数外的var声明语句,在全局对象中创建scope属性,scope=undefined
创建全局的执行环境,作用域链只有一个对象:全局对象
依次执行代码:
var scope="global"时,变量名解析开始,在全局对象属性中查找scope属性
把"global"赋给scope
遇到函数调用:创建调用对象
搜索函数中的var声明语句和参数,没有找到var声明语句
创建函数执行环境,作用域链:调用对象>全局对象
依次执行代码:
alert(scope),查询scope,变量名解析,先搜索调用对象,没找到scope属性,再搜索全局对象,找到scope属性,其值为"global"执行
scope="local",查询scope,变量名解析,先搜索调用对象,没找到scope属性,,再搜索全局对象,找到scope属性,scope="local"
alert(scope),查询scope,变量名解析,先搜索调用对象,没找到scope属性,再搜索全局对象,找到scope属性,其值为"local",执行
eg3.
scope1="global";
alert(scope1);
function f(){
alert(scope2);
scope2="local";
}
f();
过程:
创建全局对象,没有找到var声明语句,没有自定义的全局对象属性
创建全局的执行环境,作用域链只有一个对象:全局对象
依次执行代码:
scope1="global"时,变量名解析开始,作用域链是没有找到scope1属性,在全局对象属性中创建scope1属性,并赋值为"global"
alert(scope1)时,变量名解析开始,作用域链是找到scope1属性,其值为"global",执行
遇到函数调用:创建调用对象
搜索函数中的var声明语句和参数,没有找到var声明语句
创建函数执行环境,作用域链:调用对象>全局对象
依次执行代码:
alert(scope2),查询scope2,变量名解析,作用域链是没有找到scope2属性,报错scope2 is not defined
例:
function square(num){
total=num*num; //这是操作全局变量。
return total;
}
val total=50;
val number=square(20);
alert(total);//total的值变成了400。
这些代码将导致全局变量total的值发生变化。
把这个函数写成这样才是正确的:
function square(num){
var total=num*num;
return total;
}
又如:
<script>
var cookie="i am cookie";
function test(){
var cookie="i am not fei cookie";//定义局部变量的值,test函数执行后不会影响到全局的cookie
}
test();
document.write(cookie);
</script> //////////// 输出 i am cookie
去掉test()函数中变量var 如下: 
<script>
var cookie="i am cookie";
function test(){
cookie="i am not fei cookie";//修改全局变量的值
}
test();
document.write(cookie);
</script>//////test函数执行后输出 i am not fei cookie
在函数中并且不加var 如何改变全局变量?如下:
<script>
var cookie="i am cookie";
function test(){
var cookie="i am not fei cookie";//定义局部变量的值,test函数执行后不会影响到全局的cookie
window.cookie=cookie; ///第一个cookie是全局的函数外部定义的,后面的cookie是在函数内定义的
}////利用window.变量
test();
document.write(cookie);
</script> /////输出 i am not fei cookie

要在方法1中 访问 方法2的变量。
必须借助于 全局变量。
在方法2中 操作全局变量 window.cookie=cookie;
这时全局变量被 改变。
在这方法一 中去访问。

var total;
square();
square1();
function square(){
total='aaaa';
}
function square1(){
alert(total);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2017-05-05

我觉得有java的基础会更好理解这个问题

首先,全局变量是作为全局对象的类属性存在的

函数对象的属性分为私有属性类属性实例属性

函数的局部变量属于函数对象的私有属性,类似于java中private ,只能在函数内部使用

函数的类属性则类似于java中的public属性,可以通过 类名.属性名 进行访问

在JavaScript中虽然没有类的概念,但其实构造函数就是类似于java中类,所以构造函数是JavaScript中的类,类名就是函数的名称。

本回答被网友采纳

JS全局变量是全局对象的属性,函数局部变量为什么就不是函数的属性...
JS解释器开始运行时,在执行任何JS代码前,会创建一个全局对象,这个对象的属性就是JS全局变量, 并初始化为undefined var声明一个JS全局变量时,实际上就是定义了一个全局对象的属性, JS解释器还会用预定义的值和函数来初始化全局对象的许多属性,如:Infinity parseInt Math 非函数内部可以用this来引用这个全局对象 客户端...

js全局和局部的作用域
第一个之所以undefind是因为你将一个变量名定义两次,这个是不允许的,undefind在这里本质是声明错误,内存中不存在,即声明时发生错误,内存没有记录!不存在的东西js统一报错undefind!第二个:输出1,是因为,js是脚本语言,在执行时按照顺序加载,当执行到write时,var01的值是1,此时还没执行到var01=0,这一...

JS里定义变量的位置
一、js全局变量和局部变量 1、全局变量和它的作用域全局变量是指在程序开头的说明部分定义和说明的量。它的作用域分为两种情况: 1)在全局变量和局部变量不同名时,其作用域是整个程序。 2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。2、局部变量和它的作用域...

菜鸟求助:js中作用域的问题
全局变量(如globalVariable里的color和sayColor)存在于整个程序的范围内,你可以随时访问它们。在作用域内,如果你定义了全局变量,那么你就能在程序的任何部分使用它。变量的作用域通过作用域链来管理,类似于原型链。作用域链是一层一层往上查找的机制。内部作用域(如函数内定义的变量)优先级高于外部...

如何区别javaScript中定义变量有没有var的区别实例详解
1.在函数作用域内 加var定义的变量是局部变量,不加var定义的就成了全局变量。使用var定义:不使用var定义:2.在全局作用域下,使用var定义的变量不可以delete,没有var 定义的变量可以delete.也就说明隐含全局变量严格来说不是真正的变量,而是全局对象的属性,因为属性可以通过delete删除,而变量不可以。

JS中全局变量不能被函数读取吗?
可以。2种问题 下边直接上代码.1.\/\/ 全局变量和局部变量的变量名相同 输出结果依次为:第一次输出 第二次输出 2.\/\/第二种情况只有全局变量 第一次输出:第二次输出:

关于JS全局变量的问题
①如果在函数体外,带var和不带var都是全局变量。②如果在函数体内,带var的是局部变量,运行结束后就会销毁。而不带var的依然是全局变量,属于window对象。③带var的全局变量是立刻在内存中创建一块区域存储这个值,所以在js解析的时候会前置到最前面。而如果不带var,只能运行到此处的时候,再去查找...

javascript 变量问题(二)当全局(在先)与局部(在后)共存于一个函数内...
对js来说之间的function都是平等的。都是window.functionName;它们在执行前都平等的享有函数体外的变量(全局变量)的权利,即就是初始的全局变量在它们的体内都是相同的(如果这个函数使用了全局变量);只有在函数执行的时候才能 <自己> 修改变量的值(包括局部和全局的)其他地方都不能,包括他parent ...

javascript的两种变量作用域有什么不同
我在用局部变量的时候一般都是在函数里定义的,其他可能还会有其他的使用方法我也没多研究。全局变量就是可以在整个文件和包含了此文件(一般都是指JS文件)的文件中使用的变量叫全局变量,全局变量是在所有作用域(指函数、类等)外面定义的,因而所有作用域都可以使用该变量 ...

javascript 函数的参数 是局部变量吗
函数的参数是在函数内部可用的,是局部变量 但如果参数是个数组或对象(引用类型),则函数内部是可以影响到外部传参之前的变量的值 JavaScript函数传参传递的仍然是值传递,而不是引用传递

相似回答