问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-07 14:04

我来回答

2个回答

热心网友 时间:2022-05-15 08:08

局部变量和全局变量同名时,会隐藏这个全局变量;
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);
}

热心网友 时间:2022-05-15 09:26

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

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

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

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

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

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

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
有的时候脑海里有旋律。但是想不出来不知道是什么乐器演奏的。。只能... ...就听不准了 好像被和弦带偏了似的... 怎么办 钢琴 ...想用钢琴弹出来,但老是找不准音。这种情况怎么办呢,怎么练习,要是... DNF女枪炮师110级装备选择指南(全面解析女枪炮师110级装备搭配)_百度... 性生活出血要做什么检查 英国旅游签证办理需要哪些材料? 结婚证在女方户籍地办理有必要吗 结婚的时候在女方户口所在地领结婚证可以吗 结婚证可以在女方户口所在地领吗? 为什么有的微信号显示用户不存在了 为什么javascript代码能在地址栏起作用? java se 得到 js 方法(得到,不是调用) javascript解释器是什么 姜黄的药用价值? 厨师机五升跟七升容量是多少?就是一次只能打多少斤面团?掉黑粉 一点一四七升等于多少公斤 92汽油七升是多少公斤 清朝1升水等于多少斤 七升营养土等于多少斤? 92汽油七升等于多少公斤 7升的米桶能装多少斤? 华衡卫星电视接收器收台少怎么调 户户通加密定位型收台数量少了 户户通电视接收台少怎么办 在锤子便签里面的文件可不可以打印 android 数据库文件存在哪里 手机前几天刷了机 锤子便签里有很重要的东西 刷过机后 文件管理的东西 锤子便签更新了以后里面的文件丢失了该怎么找回谢谢大神们了! 复印机,兄弟mfc-7360,怎么双面复印身份证, 怎么设置扫描出来的东西是pdf格式 手机贴膜是贴薄的一面还是厚的一面? js 中这种写法叫什么 , 有什么作用吗? vb 不用webbrowser控件 如何获取JS脚本代码加载显示的文本? 请教js 代码,它的概念是什么,用来干什么的! 生蚝烹饪方法大全 iso14000环境管理体系标准 什么是IS014000 什么是ISO14001环境管理体系标准大神们帮帮忙 ISO9000,ISO18000进行比较求大神帮助 请问,我梦到 我去世两年的父亲又活了, 又回来了,好是不好? 符合CCC认证的标签有什么要求?越详细越好? raroc怎么读,是RUA RAO C,还是 瑞若克,多谢 分布式系统中实现递增序列该怎么做 vivoy3怎样在qq换轻颜相机? vivo手机微信qq拍照,怎么不能选择美颜相机了 如何把vivo手机QQ的个性相册改为普通相册? vivox3lqq怎么打不开界面相机 谁知道1992年香港金像奖最佳男配角是谁? 最年轻的金像奖影帝是谁? 求香港金像奖历届最佳影片提名作品和影帝影后提名演员。 周星驰与香港金像奖的几个问题