解决javascript全局变量失效的问题
问题:
我在js⽂件中定义了⼀个全局变量:var a,在函数B()中给a赋值,然后在函数C()中访问a结果发现a居然是undefined
原因:
查了不少资料感觉和我的情况都不同,仔细分析了⼀下,发现了⼀些端倪:我的操作是这样的,我在A页⾯中加了iframe,iframe的地址是B,我在A页⾯中调⽤了B()函数,然后⼜在B页⾯中调⽤了C()函数。问题就出在这了,javascript的全局变量的作⽤范围实际上是只在当前页⾯起作⽤(仔细想⼀下也应是这样,要不然岂不是要乱套了),从这个意义上讲javascript的全局变量也谈不上是全局变量,它只在当前页⾯中起作⽤,我们要是把当前页⾯看做⼀个类的话,那我们就完全可以把这中全局变量看做为private 的。
⾄此,问题原因就很简单了,我在A页⾯中访问的a变量和我在B页⾯中访问的a变量中访问的a变来那个并不是同⼀个变量,就好像是⼀个类⾥⾯的private变量,我在A实例中访问的和我在B实例中访问的并不是同⼀个变量是同样的道理。
解决:
原因的了,问题也就好解决了,⾸先我是在A页⾯中调⽤的B()函数,我只要在A页⾯中调⽤C()函数,那么A、B函数访问的变量就是同⼀变量了,那我怎么才能在A页⾯中调⽤B()函数呢,我要把B页⾯当中返回值作为参数传⼊B函数啊,呵呵,其实⽅法很简单了啊,只要这样就可以了:我在B页⾯中写了这么⼀句:window.parent.C(str)。
str为我要返回的值,好了我的问题就这么解决了,就好像是我在B实例中调⽤A实例的⽅法,然后传递参数⼀样,呵呵其实在C#真的很好理解,但在js中就难了点,其实我们可以这么理解,⼀个js⽂件就相当于⼀个类,我们在页⾯中引⽤这个⽂件时就相当于实例化了这个类,那么⼀切都好理解了。
我们写在js⽂件函数中的变量当然作⽤域就是这个函数,那我们写在js⽂件中的变量就相当于我们写在类中的变量,那么它的作⽤域就是这个类的实例。
补充:JavaScript中的坑--全局变量惹得祸
javascript全局数组概述
⾝为⼀名程序员,因为bug周末加班是必不可少的事情,当解决bug的时候,总有些bug是因为规范导致的,但是这些bug往往不好,也就是“前⼈挖坑,后⼈好踩”。前段时间,出现了⼀个很莫名其妙的
bug
就是有个模块页⾯数据不对。当时了半天(以为是页⾯传值的问题),到最后才发现主页⾯引⽤的⼏个js⽂件中存在⼀个相同的全局变量。
对js中的变量作⽤域的误解
很多写js的都是需要前后台⼀起写的,我就是后台java,前台js分模块⼀起写的。在这⾥,我有⼀个误区,就是以为js和java中的语法是⼀样的。但实际上还是存在着⼀些不同的地⽅。⽐如js中作⽤域只是函数级别的
1:在{}体内定义的局部变量,和在{}体外定义的局部变量实际上是⼀个,并不会新建
2:在函数体内定义的局部变量,和函数体外定义的没什么关系。
⽅便记忆的代码如下:
<script>
var test_id = "my love";
if(true){
console.log(test_id);
var test_id = "where my love?";
console.log(test_id);
}
console.log(test_id);
</script>
显⽰结果:
这就是js中没有块级作⽤域的证明:很显然发现test_id实际上只有⼀个
证明js中变量是函数级别的
<script>
var test_id = "my love";
function findLove(){
var test_id ;
console.log(test_id);
test_id = "is you?";
console.log(test_id);
}
findLove();
console.log(test_id);
</script>
输出结果:
然后我试了⼀下:在{}体内不⽤var声明:
<script>
var a = "heh"
if(true){
console.log(a);
}
</script>
其实也是可以的输出 heh
试⼀下函数体内部⽤var ,注意⼀下:代码不同之处
<script>
var a = "heh"
function findLove(){
console.log(a);
}
findLove();
</script>
<script>
var a = "heh"
function findLove(){
console.log(a);
var a
}
findLove();
</script>
第⼀个输出的是 heh ;第⼆个输出的是 undifined,⼀⽬了然。这个地⽅还有⼀个细节:就是在函数体内,先定义后打印和先打印和定义,实际上是⼀样。
⾃我测试⼀下吧:(猜⼀下输出结果,在验证⼀下吧)
<script>
var a = "heh"
function findLove(){
console.log(a);
function findforyou(){
var a ="you";
console.log(a);
}
function findother(){
console.log(a)
}
findforyou();
findother();
}
findLove();
</script>
⼆:函数闭包
因为js中变量的作⽤域是函数级的,所以⽤闭包来解决⼀些传值问题(⽐如递归)。篇幅太长了,这次不介绍了。以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。如有错误或未考虑完全的地⽅,望不吝赐教。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论