关于作用域的一点疑问和分析——changeColor

今天在看JS高程3的时候看到这样一段代码,同时联想到之前看视频教程的时候看到的一段代码,开始有些疑惑,后面再看一遍视频便理解了。

先上两段代码:

 1 var color = "blue";
 2 function changeColor(){
 3     alert(color);                          //   blue
 4     if(color === "blue"){
 5       color = "red";
 6    }else {
 7        color = "blue";
 8    }
 9 }
10 changeColor();
11 alert("color is now " + color)     //  color is now red

第二段:

1 var color = "blue";
2 function changeColor(){
3   alert(color); // undefined
4   var color = "red";
5 }
6 changeColor();
7 alert("color is now " + color) // color is now blue

疑惑:两段代码中,为什么第一段代码中的color会返回blue,而第二段代码则是返回undefined? 按理说,function里面是可以通过作用域链访问到外部的全局变量的。但是为什么这里返回的结果不一样呢??

初步猜想是因为if else 语言造成的影响

表达式可以修改预解析的值; 函数的环境内也是一个局域; 函数里面的代码,是在调用他的时候才执行的;

实际原因:

第一段代码是因为函数内,没有var 也没有function,没有参数,所以就要跑到全局环境里面去找

找到color的值被修改为"blue", 所以这里的alert(color)返回blue,跟if语句其实没啥关系。

而第二段代码,是因为函数被调用时候,里面有var,与解析的时候会给a一个未定义 a=... ,所以在逐行执行函数内代码时候,第一行会返回undefined;

时间: 2024-12-29 16:54:55

关于作用域的一点疑问和分析——changeColor的相关文章

关于String的split方法的一点疑问

今天莫名其妙的又做了一下leetcode上面的第一题,是简单的字符串逆序输出问题.下面是我处理的代码: public String reverseWords(String s) { if(s == null) return new String(""); StringBuffer fir = new StringBuffer(s); if(fir.length() == 0) return new String(""); while(fir.length() !=

工厂模式的一点疑问

最近看了一下设计模式中的工厂模式,对于其中的工厂方法模式有一点疑问,在此记录,方便以后学习所需. 首先工厂模式是为了满足开闭原则:扩展开放,修改封闭. 对比一下简单工厂模式和工厂方法模式,会发现简单工厂模式中的createBMW()方法中包含的选择生成方法的switch语句,在工厂方法模式中的工厂类里没地方放,因此只能移交给客户,由客户来做switch.好了,那么问题来了(挖掘机哪家强?),在工厂方法中真的满足开闭原则吗?是的,工厂类和产品类满足,可是客户类呢?增加一个产品就必须到客户类里修改s

对于sql缓存的一点疑问,以及对未来的展望

对于数据库,我也是个小白 我先举个我遇到的例子吧 一张考勤结果表,这是结果表tm_dayresult id(主键)   psn_num(人员编号)  dutydate(排班日期)  starttime(上班时间) endtime(下班时间)    缺勤时间,旷工时间,早退时间,工作时间,,,,, 客户的情况是:(规定工作时间是08:30-17:30) 客户的需求是,假如我今天加班到20:00之后,第二天9:30以后打卡才算迟到 我接手的情况是:没有源代码,不能改源代码(用友标准产品,不允许修改)

关于系统模块设计的一点疑问?

哎,昨晚又和女朋友吵架了,心太累!! 一个刚参加工作的程序员. 好了,昨天在做模块设计的时候有点疑问,不知道合不合适,就是“一个模块的设计需不需要考虑另外一个模块的方便而提供一些接口呢?”,(在这里我用A模块和B模块).总是感觉如果A模块能提供一些接口,那样B模块就会少写很多代码,而且代码结构也会看起来很清晰,不用写很多重复的代码.但是,对于A模块而言,对于自身的需求,是完全不需要用到那些接口的.举个很简单的例子 /* * 内部数据层 */ class A { public: int getCh

程序开发与需求分析的一点疑问与思考

静静的坐在出差归往西安的火车上,想着工作以来程序开发过程中的磕磕绊绊,总觉得不入其法. 并不是编程技能得不到提升,而是程序开发出来与甲方领导的想要的相差甚远.虽然做了很多工作,可领导关心的往往却没有做或者没有达到领导想的那样.在冥思略想之下,这也许就是沟通不到位,需求不到位的恶果.有人可能说,那你去沟通啊,去做好需求啊!哥,我也想啊,可人家领导忙的很呀,只能通过领导讲的大概,自己去琢磨.也许该读读项目管理方面的书,技术在牛逼,连需求都不清楚,做出来是什么鬼??. 第二个就是专业性.通过几次给甲方

关于Python中输出中文的一点疑问

#encoding=gb2312 import urllib import re def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImg(html): reg = r'<strong>(.*)</strong>' imgre = re.compile(reg) imglist = re.findall(imgre, html) return imglist html

PO标准form的一点疑问

最近在修改采购订单form的时候,发现采购订单form往数据库中插数据的地方找不到,程序太多.我们又需要根据界面上的item的值在订单界面数据生成数据库数据时插值时,只能是想其他办法,一种是在on-insert触发器上加上自己 的插值处理程序,这并不会影响正常订单数据的插入,但在on-insert时界面上相关的各种关联id(如header_id,line_id等)是没数据的,所有有时这样也不满足需求,只能在表上写触发器,当然不推荐在表上写触发器,不知道有没有谁对这样的需求有更好的解决办法可以分享

关于虚拟机与宿主机同网段主机互ping的一点疑问

宿主机win10(192.168.1.0/24)虚拟机win2008r2(192.168.159.0/24)使用NAT模式,宿主机和虚拟机能够互ping通,虚拟机能够ping通与宿主机同一网段的任何计算机,但与宿主机同网段的计算机却不能ping通虚拟机,不知道是为何?我是菜鸟,请各位老师能给我解释下为什么不?

c#属性一点疑问

public class A     {         //定义一个b属性         public B b         {             get             {                 return new B();  //每次get均调用             }         }         //public B b = new B();   只调用一次     } 如果 A a=new A();  a.b每次访问,B的创建次数不一样的. 最