学javascript必须要知道的事
第一:变量声明
在使用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必须要知道的事的更多相关文章
- C# 范型约束 new() 你必须要知道的事
C# 范型约束 new() 你必须要知道的事 注意:本文不会讲范型如何使用,关于范型的概念和范型约束的使用请移步谷歌. 本文要讲的是关于范型约束无参构造函数 new 的一些底层细节和注意事项.写这篇文 ...
- 十件你需要知道的事,关于openstack-trove(翻译)
开源数据库即服务OpenStack Trove应该知道的10件事情 作者:Ken Rugg,Tesora首席执行官 Ken Rugg是Tesora的创始人,CEO和董事会成员. Ken的大部分职业都是 ...
- 关于Unicode,字符集,字符编码,每个程序员都应该知道的事
关于Unicode,字符集,字符编码,每个程序员都应该知道的事 作者:Jack47 李笑来的文章如何判断一个人是否聪明?中提到: 必要.清晰.且准确的概念,是一切思考的基石.所谓思考,很大程度上,就是 ...
- 网站开发进阶(三十八)Web前端开发规范文档你需要知道的事
Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...
- Web前端开发规范文档你需要知道的事
Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...
- 学习IOS需要知道的事
什么是iOS iOS是一款由苹果公司开发的操作系统(OS是Operating System的简称),就像平时在电脑上用的Windows XP.Windows 7,都是操作系统 那什么是操作系统呢?操作 ...
- 信息图:iOS 7开发者需要知道的事
如果你想为iOS 设备开发app,你需要知道如何与软件交互,如何设计,你还要知道苹果独特的开发理念和开发工具.真正的能力还需要成功地从其他行业领域借鉴核心概念.最后把所有这些东西糅合进你的信息库中 ...
- 史上最走心webpack4.0中级教程——配置之外你应该知道的事
<webpack4.0各个击破系列>适合不满足于只会配置webpack但一时间又看不懂源码的中级读者.我没法保证这个系列是最好的,但至少能保证每一篇博文都跟那些Ctrl+C和Ctrl+V的 ...
- 漫谈ElasticSearch关于ES性能调优几件必须知道的事
lasticSearch是现在技术前沿的大数据引擎,常见的组合有ES+Logstash+Kibana作为一套成熟的日志系统,其中Logstash是ETL工具,Kibana是数据分析展示平台.ES让人惊 ...
随机推荐
- [原]Jenkins(一)---我理解的jenkins是这样的
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. *版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5330 ...
- eclipse启动无响应,停留在Loading workbench状态,或老是加载不了revert resources
做开发的同学们或多或少的都会遇到eclipse启动到一定程度时,就进入灰色无响应状态再也不动了.启动画面始终停留在Loading workbench状态.反复重启,状态依旧. 多数情况下,应该是非正常 ...
- 关于java中线程休眠的另一种写法
编辑器加载中... 优先使用TimeUnit类中的sleep() TimeUnit是什么? TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的 ...
- 如何用Fiddler对Android应用进行抓包
Fiddler是一款非常流行并且实用的http抓包工具,它的原理是在本机开启了一个http的代理服务器,然后它会转发所有的http请求和响应,因此,它比一般的firebug或者是chrome自带的抓包 ...
- 『TCP/IP详解——卷一:协议』读书笔记——04
2013-08-18 16:31:17 第2章 链路层 2.1 引言 链路层主要有三个目的: 为IP模块发送和接受IP数据报 为ARP模块发送ARP请求和接受ARP应答 为RARP发送RARP请求和接 ...
- Android简单图片浏览器
效果如下: 代码编写如下: Crize_demo\app\src\main\res\layout\activity_main.xml <!--定义一个线性布局--> ...
- 【概念笔记】JavaEE - web part2
IT`huhui前言录 续JavaEE - web part1 链接http://www.cnblogs.com/ithuhui/p/5930745.html, 持续修改更新. Cookie 1. 定 ...
- 在Ubuntu14.04 32位中安装mongodb
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-i686-3.0.6.tgz .tgz mkdir -p mongodb / mongod ...
- SQL Server In-Memory OLTP 无损PPT分享
我在今年DTCC上SQL Server内存数据库分享 PPT.感兴趣的朋友可以看下,无闩锁的数据结构使得热区问题成为过去,并行很好的维护了CPU Cache的命中率,Native代码执行使得CPU流水 ...
- leveldb.net对象读写封装
leveldb是一个非常高效的可嵌入式K-V数据库,在.NET下有着基于win实现的包装leveldb.net;不过leveldb.net只提供了基于byte[]和string的处理,这显然会对使用的 ...