第一:变量声明

在使用javascript时使用变量时首先做的是声明变量,变量声明的关键字是var。

例子:

var i;

var sum;

也可以多个变量声明:

var i,sum;

还可以在声明时赋值。

var i=0;

如果没有给var声明的变量指定初始值,那么在给其初始值之前这变量一直是undefined。

javascript是动态语言在运行期间才会去做数据类型检查,所以不需要给变量指定数据类型,它会在第一次赋值时把数据类型记录下来。

而c和java不一样,它们是静态语言,需要先定义好,数据类型才可以。

例子:

var i=0;

i="len";

先给它赋值一个,然后再给它赋值别的数据类型的值,完全是合法的。

第二:重复声明和遗漏的声明


  使用var语句重复声明变量是合法的,这个一条赋值语言没有区别。

这个遗漏声明就不一样了,遗漏声明看你在哪遗漏,这个就要讲究一下了,因为全局变量和局部变量原因。

全局变量就是在javascript代码中的任意位置都有效的变量(前提是这个变量没被声明)。

而这个遗漏声明无论怎么都会变成一个全局变量,但它和你在全局作用域你声明的变量有些不一样,虽然它们

在作用上好像区别不大,但你要知道没声明的变量其实已经变成一个自定义属性,window低下的一个自定义

属性,例如:

V=2;===>window.V=2;

因为在全局作用域下,window可以忽略不写,所以经常会忘记还有window,所以它是可以删除的,在

使用delete运算符时。

例子:

var truevar=1;

delete truevar;              //声明了删除不了

  fakevar=2;

delete fakevar;             //删除了变量

第三:变量作用域

一个变量的作用域是程序源代码中定义这个变量的区域,全局变量拥有全局作用域,在js代码里任何位置都

是有定义的。然而在函数内声明的变量在函数内有定义,它们是局部变量,作用域是局部性的,局部性就是局部使

用,出去这个作用域就会无效,函数的参数也是局部变量,它们只在函数体内有定义。

在函数体内,局部变量比同名的全局变量优先级高,如果函数体内声明一个局部变量或函数参数中带有的变量和全

局变量重名,那么全局变量会被覆盖掉。

例子:

var scope="global";

function part(){

var scope="part";

alert(scope);

}

part();                //弹出的是一个part

alert(scope);     //弹出的是一个global

例子:

var scope="global";

function part(){

scope="part";

alert(scope);       //弹出part

}

part();

alert(scope);      //弹出的是一个part

这个上面那个区别在于在函数里有没有重复声明一个与全局变量同名的变量。从代码的效果很明显,在函数体内没有声明就会

是全局变量,所以重新赋值一次,它的值就会改变。

函数是可以嵌套的,由于每个函数都有自己的作用域,所以会出现几个局部作用域嵌套的情况。

例子:

var scope="1";

function part(){

var scope="2";

function part1(){

var scope="3";

alert(scope);                 //3

}

alert(scope);                 //2

}

alert(scope);                 //1

不做解析,自己想想。

第四:函数作用域和声明提前

在一些语言里花括号内就是一段代码的作用域,而且变量的声明在作用域之外是

不可见的,我们称这为块级作用域。js没有块级作用域,而它有函数作用域,变

量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是由定义的。

function test(){

var i=0;

if(i==0){

console.log(i);                //0

}

}

js的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的,这个怎么理解呢?

就是如果你在函数体内先使用这个变量,然后再声明这个变量,它就会理解为你已经声明

了这个局部变量了,所以你在使用这个局部变量,无论你在函数体内哪里声明的,在函数

体内哪里使用它,都会解析为你声明了它为局部变量,可以在这个局部使用它,不会改变

全局同名的变量。

例子:

var i=0;

function part(){

alert(i);

var i=1;

}

就是以上的情况,他不会弹出0,但也不会弹出1,因为1的赋值是在使用这个函数之后,所以

它会弹出undefined。

这是不是意味着,变量在声明前就可见、可用了。

而这被称作“声明提前”。就是函数内所有声明的函数都被提前到函数的顶部。

第五:作用域链


简单易懂的说一下吧。当代码在一个环境中执行时,作用域第一个对象始终是当前执行代码所

在环境的变量对象。

如果执行环境是函数,那么将其活动对象作为作用域链第一个对象,第二个对象是包含环境,

下一个是包含环境的包含环境。。。。。一直到找到需要查找的。

在函数运行过程中标识符的解析是沿着作用域链一级一级搜索的过程,从第一个对象开始,逐

级向后回溯,直到找到同名标识符为止,找到后不再继续遍历,找不到就报错。

这些需要懂,不是写js代码后出现问题会很吃力。

以下是简单的描述上面的知识:

作用域:
域:空间、范围、区域。。。。

作用:在空间范围可以读写操作

js预解析                                              //这是声明提前的理解

1)“找一些东西”:var function 参数

a=未定义

所有的变量,在正式运行代码之前,都提前赋了一个值:未定义

fn1=function fn1(){alert(2);}

所以的函数,在正式运行之前,都是整个函数块

2)逐行解读代码

表达式:=、+、-、*、/、%等都是表达式,表达式就是动作,可以改变值

1)如果重名,只有一个存储到仓库,预解析先在到函数块,然后再优先级,从上往下,越下优先级越大;

2)然后逐行读代码
见到表达式就执行 表达式优先

域是至上而下,是单线程的,处理完一个再到下一个,就像引入库;

函数也是一个域,只是一个局部的域;

就会执行预解析的步骤;

如果内部有这个变量,就会优先这个变量,局部变量优先

子级作用域到父级作用域,就是作用域链

解析流程

1)预解析

2)逐行解读代码:

表达式

函数调用:

1)预解析

2)逐行解读代码

传参就是在函数里var 声称一个变量然后赋值给他

想要获取函数里的值:

全局变量

函数里的函数传参

学javascript必须要知道的事的更多相关文章

  1. C# 范型约束 new() 你必须要知道的事

    C# 范型约束 new() 你必须要知道的事 注意:本文不会讲范型如何使用,关于范型的概念和范型约束的使用请移步谷歌. 本文要讲的是关于范型约束无参构造函数 new 的一些底层细节和注意事项.写这篇文 ...

  2. 十件你需要知道的事,关于openstack-trove(翻译)

    开源数据库即服务OpenStack Trove应该知道的10件事情 作者:Ken Rugg,Tesora首席执行官 Ken Rugg是Tesora的创始人,CEO和董事会成员. Ken的大部分职业都是 ...

  3. 关于Unicode,字符集,字符编码,每个程序员都应该知道的事

    关于Unicode,字符集,字符编码,每个程序员都应该知道的事 作者:Jack47 李笑来的文章如何判断一个人是否聪明?中提到: 必要.清晰.且准确的概念,是一切思考的基石.所谓思考,很大程度上,就是 ...

  4. 网站开发进阶(三十八)Web前端开发规范文档你需要知道的事

    Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...

  5. Web前端开发规范文档你需要知道的事

    Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...

  6. 学习IOS需要知道的事

    什么是iOS iOS是一款由苹果公司开发的操作系统(OS是Operating System的简称),就像平时在电脑上用的Windows XP.Windows 7,都是操作系统 那什么是操作系统呢?操作 ...

  7. 信息图:iOS 7开发者需要知道的事

      如果你想为iOS 设备开发app,你需要知道如何与软件交互,如何设计,你还要知道苹果独特的开发理念和开发工具.真正的能力还需要成功地从其他行业领域借鉴核心概念.最后把所有这些东西糅合进你的信息库中 ...

  8. 史上最走心webpack4.0中级教程——配置之外你应该知道的事

    <webpack4.0各个击破系列>适合不满足于只会配置webpack但一时间又看不懂源码的中级读者.我没法保证这个系列是最好的,但至少能保证每一篇博文都跟那些Ctrl+C和Ctrl+V的 ...

  9. 漫谈ElasticSearch关于ES性能调优几件必须知道的事

    lasticSearch是现在技术前沿的大数据引擎,常见的组合有ES+Logstash+Kibana作为一套成熟的日志系统,其中Logstash是ETL工具,Kibana是数据分析展示平台.ES让人惊 ...

随机推荐

  1. ios SourceTree中添加git项目工程文件

    1.创建远程git仓库 2.复制远程仓库地址,最好选择http的地址. 3.在自己的电脑上下载一个SourceTree,然后在自己的电脑上建立链接. 点击左上角的+号桶开始添加,弄好点击Clone 4 ...

  2. three.js 源码注释(三十九)Light/HemisphereLight.js 半球光、 自然光(天光效果)

    /*** * HemisphereLight类 是在场景中创建半球光,就是天光效果,经常用在室外,将各个位置的物体都照亮,室内的光线大多是方向性的, * 无论是窗口还是灯槽,用平面光很方便,室外用平面 ...

  3. rm: Argument list too long

    rm -rf  /testdir/* -bash: /bin/rm: Argument list too long 解决: cd /testdir/; ls | xargs rm -rf

  4. windows防火墙打不开的处理办法

    一.防火墙配置出错 开始-->运行-->gpedit.msc 这时,打开了组策略 在左面分级展开 计算机配置-->管理模板-->网络-->网络连接-->Window ...

  5. python 迭代器和生成器

    1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)2.可迭代对象:实现了迭代器协议的 ...

  6. Adding AirDrop File Sharing Feature to Your iOS Apps

    http://www.appcoda.com/ios7-airdrop-programming-tutorial/ Adding AirDrop File Sharing Feature to You ...

  7. 去除html标签 正则表达式

    /// <summary>        /// 去除html标签        /// </summary>        public static string Clea ...

  8. lvs主备可以自由切换,vip落在主上的时候,端口无法telnet,业务连接不了

    lvs主备可以自由切换,vip落在主上的时候,端口无法telnet,业务连接不了 解决:将主上的keepalived重启,故障解除 原因:不可知 lvs常见故障原因: real server上的脚步没 ...

  9. openssl,db,mysql,sasl编译安装

    yum -y install nfs-utils nfs4-acl-tools nfs-utils-libyum -y install gcc gcc* libtool libtools-ltdl l ...

  10. Excel VBA自动添加证书(二)

    继续上次没有写完的随笔,本来是很想一次性写完的,但是到中午一点了还没有吃东西,其实饿的不行了,还好写博客时会自动保存,中间电脑实然蓝屏,花了二个多小时写的没有点击保存,吓我一下,以为会全没了. 前面讲 ...