天空一声巨响,道长闪亮登场,飞花落叶,尘土飞扬,此处不应恐慌,用阅读变量的概念来提升气场。

1)变量的声明,使用一个变量之前应该先声明。变量是使用关键字var来声明的,如下:

  var number;     //申明了一个变量

2)变量的赋值,如下:

  number=520;   //给变量赋值(javascript中的变量是可以赋任意类型的值的,比如字符串,对象,函数等等)

3)上面两个步骤可以合到一起,如下:

  var number=520;  //等价于前两步

**有人会说 number=520;  即使没用var声明,变量一样的使用,其实是有区别的,这里就不做无意义的讨论了。

**你只要记住,这是一个不好的习惯,应当始终使用var关键字来声明变量。

故事就从这里开始了。

看一段代码:

  if(!(n in window)){

var n=100;    //注意这行代码等价于 var n; n=100;这两行代码

  }

  alert(n);

  alert(a);

这里, alert(n)会弹出undefined,     alert(a)会报错:a is not defined。

弹出undefined的意思是n已经声明但是还没有赋值,报错是a没有声明,不存在。

a报错好理解。这里我要解释为什么alert(n)会弹出undefined,而不是报错或者弹出100.

其中的原理有点复杂。

先来理解javascript的两个概念:作用域和声明提前。

1 作用域:

我们知道类似c语言,比如java的花括号都有自己的作用域。

但是javascript 不同,它的if等花括号不算块级作用域(函数除外)。

2 声明提前:

变量的声明会被提前到作用域的顶部(意味着变量在申明之前就可以使用了,只要在作用域内)

好吧,从 var n=100; 这一行代码说起,if的花括号关不住它的,所以n算全局变量.

因为if的条件返回false,所以不会执行赋值的操作,不可能弹出100.

而根据申明提前,javascript引擎的“预编译”是在代码开始运行之前执行的,

它才不管if的条件是true还是false,

它看到var关键字就把这个变量申明提到作用域第一行了,它就是这么任性。

但是变量赋值就惨了,他说:if的条件是false,我永远不会被执行啦。

javascript中声明过的变量如果没赋值就是undefined。

而函数是有自己的作用域的,来一个例子加注释,如果你不能理解的话,那就不理解吧。

这里声明了两个scope,一个是全局变量,一个是只能在函数中使用的局部变量。

var scope="global";

function f(){

  console.log(scope);

  var scope="local";//这里等价于两步 1:var scope; 2:scope="local"; 第一步由于声明提前在捣鬼,会把它提到函数第一行

  console.log(scope);

}

两次动作console.log(scope);都是在函数中打印scope变量的值。

如果函数作用域中有了scope,两次都不会理睬外面声明的scoped。(局部作用域优先)

所以第一次打印出undefined,第二次打印出local;

道长叨叨:javascript全局变量是全局对象的属性,而局部变量没有这样规定,在扯下去一夜都叨叨不完了。

道长的建议:函数里面的变量申明尽量放在函数体顶部,让代码更具可读性。

JavaScript之周道长浅谈变量使用中的坑的更多相关文章

  1. 读《你不知道的JavaScript(上卷)》后感-浅谈JavaScript作用域(一)

    原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们,也入手看看这 ...

  2. 浅谈javascript函数,变量声明及作用域

    javascript函数跟变量的声明.作用域这些概念网上都已经讲烂了. 这里写个博客,也相当于做个笔记. 变量声明 首先看个例子: var globalVar = "gv"; fu ...

  3. 浅谈 JavaScript 编程语言的编码规范

    对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...

  4. [转载]浅谈JavaScript函数重载

     原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...

  5. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  6. 浅谈JavaScript中的内存管理

    一门语言的内存存储方式是我们学习他必须要了解的,接下来让我浅谈一下自己对他的认识. 首先说,JavaScript中的变量包含两种两种类型: 1)值类型或基本类型:undefined.null.numb ...

  7. 浅谈javascript的原型及原型链

    浅谈javascript的原型及原型链 这里,我们列出原型的几个概念,如下: prototype属性 [[prototype]] __proto__ prototype属性 只要创建了一个函数,就会为 ...

  8. 浅谈JavaScript中的null和undefined

    浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...

  9. 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)

    虚拟化构建二分图 ------BZOJ2080 题解+浅谈几道双栈排序思想的题 本题的题解在最下面↓↓↓ 不得不说,第一次接触类似于双栈排序的这种题,是在BZOJ的五月月赛上. [BZOJ4881][ ...

随机推荐

  1. 【转】 C# 小技巧之获取变量名称

    link: http://www.cnblogs.com/gongy/p/lm-2015-04-03.html 今天在自我规范程序设计的时候,变量名匹配字符串来自配置文件,网上找了一会儿发现也有朋友在 ...

  2. node npm 安装模块 淘宝镜像

    npm --registry https://registry.npm.taobao.org info underscore

  3. &&和||的妙用

    在js逻辑运算中,0."".null.false.undefined.NaN都会判为false,其他都为true 几乎所有语言中||和&&都遵循“短路”原理,如&a ...

  4. Host 'XXX' is not allowed to connect to this MySQL server 解决方案/如何开启MySQL的远程帐号

    www.cnblogs.com/zhangzhu/archive/2013/08/22/3274831.html 如何开启MySQL的远程帐号-1)首先以 root 帐户登陆 MySQL 在 Wind ...

  5. oracle 数据库的学习1

    1.oracle 数据库常用的基本类型 char(10)  -->存储固定长度的字符串 varchar2(10)-->存储可变长的字符串 Date INTEGER -->存储整数 N ...

  6. 我的VPN推荐经历

    先说说我为什么会走上VPN推荐之路的. 忘记了什么原因需要上某一国外的网站,但是这个网站在国内被禁止访问,于是我想到了VPN,我在网上搜索VPN,找到了几个VPN推荐的博客,然后我根据博客的推荐到了某 ...

  7. ef 对象无法序列化的问题(System.Data.Entity.DynamicProxies)

    错误提示: System.InvalidOperationException: 生成 XML 文档时出错. ---> System.InvalidOperationException: 不应是类 ...

  8. iOS的架构

    根据多年的iOS开发经验,常用的iOS开发架构有:MVC.MVVM.CDD等,在这里我就不一一列举了. 做一个项目一般首先要搭建主流框架界面:常见的有TabBar控制器可以切换子控制器,上面又有Nav ...

  9. hdu5442 Favorite Donut

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5442 题目大意:给你一个长度为n的字符串,将它首尾相连成环.问你这个环上找一个长度为n的字典序最大的串 ...

  10. python积累

    python积累 一.逐渐积累 python逐渐积累 http://www.cnblogs.com/lx63blog/articles/6051526.html python积累_2 http://w ...