JavaScript 语法总结2
1. 对象的toString()和valueOf().
- toString() 和Java中的toString() 一样
- valueOf(), 和toString() 都是用来进行类型转换的方法, 但是valueOf只是简单返回对象本身.
var d = new Date(2015,12,07);
console.log(d.valueOf()); //返回了对象本身,然后再调用对象的toString()
2. JavaScript中变量的特征
- 应当在使用之前声明, 声明如: var i,sum="hello",j=1;
- 可以是任意类型, 可以先使用数字初始化一个变量, 然后再将字符串赋值给这个变量(所以重复声明变量是合法且无害的).
- ECMAScript3中给一个未声明变量赋值,该变量会变成全局对象的一个同名属性, 像全局变量一样工作; 在ECMAScript5中则会报错, 建议都使用var声明(局部变量必须使用var语句声明=>为了避免误改全局变量).
- 在函数体内,局部变量的优先级高于同名的全局变量.
var scope = "global";
function checkscope(){
var scope = "local";
return scope;
}
console.log(checkscope()); //"local"
- 没有块级作用域, 而是函数作用域.
3. 函数作用域和声明提前
- js的函数作用域是指声明在函数内的所有变量在函数体内都始终可见, 这就意味着变量在声明之前就已经可用, 这种行为就称为声明提前. 具体讲就是js函数内声明的所有变量(不涉及初始化和赋值),都被提前至函数体的顶部.
function test(obj){
var i=0;
if(typeof obj == "object"){
var j=0;//在整个函数体内都是有定义的,不仅仅是这个代码段
for(var k=0;k<10;++k){
console.log(k);
}
console.log(k);//在外部也可以引用.
}
console.log(j);
}
test({});
var scope = "global";
function test2(){
console.log(scope);//"undefined", 因为声明提前的原因,这里并不会引用全局变量,同时赋值还没有开始.
var scope = "local";//"local"
console.log(scope);
}
test2();
4. 作用域链
- 下面是javascript权威指南里面的解释:
> 将一个局部变量看作是自定义实现的对象的属性, 每一段代码(全局代码或者函数) 都有一个与之关联的作用域链, 这个作用域链是一个对象列表或者链表, 这组对象定义了这段代码 "作用域中" 的变量.
> 变量解析: 当js需要查找变量x的值时, 就从链中的一个对象开始查找, 查找这个对象是否有名为x的属性, 如果过有就直接使用这个属性, 否则继续查找下一个对象, 直到找到或者抛出一个引用错误异常.
> js最顶层代码中(即不包含在任何函数定义内的代码), 作用域链由一个全局对象(如window对象)组成; 在不包含嵌套的函数体内, 作用域链上有两个对象([定义函数参数和局部变量的对象, 全局对象]); 在一个嵌套的函数体内, 作用域链上至少有3个对象.
> 当定义一个函数时, 实际上是保存一个作用域链, 当调用这个函数时, 它创建一个新的对象来存储它的局部变量, 并将这个对象添加至保存的那个作用域链上, 同时创建一个新的更长的表示函数调用作用域的"链".
> 对于嵌套函数而言: 每次调用外部函数时, 内部函数又会重新定义一遍, 因为每次调用外部函数的时候, 作用域链可能都不同.
- 引用一篇讲得比较好的 博文, 概括一下主要就是:
> 函数是对象, 有许多属性, 其中一个内部属性是 [[scope]], 在函数定义时会创建一个对象(scope-chain), [[scope]]属性指向这个对象, 这个对象会保存一个全局对象(包含了所有全局信息).
> 调用函数是, js引擎创建一个execution context对象, 有一个作用域链属性, 这个属性由两部分组成:
- 活动对象: 由函数的参数, 局部变量, 命令参数arg, this组成, 在作用域链的顶端. 调用结束后销毁.
- 其他对象: 全局对象和其他对象就按照函数的作用域链的顺序依次复制到此作用域链的后面.
> 函数执行过程中每遇到一个变量都会从作用域链的头部去遍历解析.
> 优化: 由于全局对象在作用域的后面(至少在活动对象的后面), 所以尽可能使用局部变量(或者将全局变量先保存在局部变量中, 然后在后面多次使用, 如: var doc = document.getElementById("..."); doc.... )
> with语句和 try-catch会改变作用域链
- with: 创建一个包含with语句参数的(如with(document)中的document)的 with对象, 并推到作用域链的顶端. 这样活动对象的位置往后移动了, 所以性能可能会降低. ----避免使用with
- try-catch: 当try发生错误时, 跳到catch中, 然后把异常对象推入一个可变对象并置于作用域的头部, catch中的变量也会被放入在这个对象中, 执行完catch之后会恢复作用域链.---- 委托给处理器方法
-->
JavaScript 语法总结2的更多相关文章
- JavaScript:JavaScript语法的详细介绍
JavaScript语法:只要Java会了,基本上javascript语法就会了. ——变量的定义 ——程序的结构控制 ——数组操作 ——函数的定义即使用 基本的test.html代码如下,它会导入下 ...
- javascript语法详解
javascript语法:运算符 条件语句if...else... 条件语句switch 循环语句for 循环语句while 跳转语句 js运算符 1.算数运算符:+ - * % / ++ ...
- When Colon Scripting is comming(JavaScript语法扩充)
当冒号脚本来临-- JavaScript语法扩充 连续好几夜的不能安眠,得出结论就是,未来语言未来的编译器应该是支持语法定制规则和语法扩展的,这样使得编程语言不断进化以更利于人类使用!of cours ...
- Javascript语法基础
Javascript语法基础 一.基本数据类型 JavaScript中支持数字.字符串和布尔值三种基本数据类型: 1.数字 数字型是JavaScript中的基本数据类型.在JavaScript ...
- JavaScript语法细节——引用与复制
原文:JavaScript语法细节--引用与复制 我们都知道,JS中变量的赋值有两种方式,最近在折腾自己写的标签栏插件,碰到了很多平时没注意的问题.正好,那边处理清楚了,稍微整理一下关于引用与复制相关 ...
- 第九十八节,JavaScript语法、关键保留字及变量
JavaScript语法.关键保留字及变量 学习要点: 1.语法构成 2.关键字保留字 3.变量 任何语言的核心都必然会描述这门语言最基本的工作原理.而JavaScript的语言核心就是ECMAScr ...
- JavaScript 语法
一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...
- JavaScript DOM 编程艺术(1)---> JavaScript语法
一. JavaScript语法目录 语法 操作 条件语句 循环语句 函数 对象 二. 具体内容 2.1 语法 javaScript代码要通过HTML/XHTML文档才能执行.可以有两种方式完成这一 ...
- JavaScript语法详解:JS简介&变量
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. JavaScript简介 Web前端有三层: HTML:从语义的角度,描 ...
- 读《javascript语法精粹》知识点总结
昨天泡了大半天的读书馆,一口气看完了<javascript语法精粹>这本书,总体来说这本书还是写的不错,难怪那么多的推荐.<javascript语法精粹>主要是归纳与总结了ja ...
随机推荐
- CH2101 可达性统计
题意 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 分析 有向无环图,可以按拓扑序逆序统计答案.可以用bitset维护可达性. 时间复杂度\(O(N ...
- 树莓派系列教程:安装系统与配置环境,使用PuTTy与VNC图形界面远程登录
本文所需物品清单: Raspberry Pi 3 Model B 主板.SD卡与读卡器(用于烧录系统) 资料整理来源在文尾 需要下载的资源与工具: 推荐系统-Raspbian 树莓派官方深度定制的硬件 ...
- 时间记录 APP:爱今天脑图
时间记录 APP:爱今天脑图 爱今天 时间记录 以时间记录为主线 晨音 总结 目标 标签 统计 日统计 周统计 月统计 技能培养 一万小时定律 睡眠状态 番茄钟 时间间隔提醒 15 分钟 30 分钟 ...
- 深入理解java虚拟机,类加载
1,通过使用静态字段,只有真正定义这个字段的类才会被初始化,(子类不初始化,父类初始化 2,new数组,不初始化 3,通过类来调用一些类的常量,可以不初始化类,(常量在编译期,被优化到NotIniti ...
- 获取刚刚插入表格的这条信息的自增ID
获取刚刚插入表格的这条信息的自增ID var conn=getConnection(); var msql="INSERT INTO " + table +" (&quo ...
- .NET委托解析(异步委托)
上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.NET 委托的内部实现,从浅入深的角度来详细的去解析委托的实质,本文将系上篇继续讨论异步委托的实现以及异步委托的源 ...
- bzoj 4006 [JLOI2015]管道连接——斯坦纳树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 除了模板,就是记录 ans[ s ] 表示 s 合法的最小代价.合法即保证 s 里同一 ...
- 统计中的bitMap
//位图的概念就是在个一字节八位的地方存八个状态 比如 bool hash[] 表示某个数字被标记过,一个数字需要一个字节 而bitMap就是可以把每位都用来标记,起到节约空间的目的 //位图的概念就 ...
- OpenLTE安装教程
安装需求: USB3 interface Modern multicore CPU (Intel Core i5, Core i7 or equivalent with SSE4.1 SSE4.2 a ...
- 转--NLTK的内置函数
NLTK的内置函数 1. 词语索引 (1) concordance函数 给出一个指定单词每一次出现,连同上下文一起显示. >>>text1.concordance('monst ...