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的更多相关文章

  1. JavaScript:JavaScript语法的详细介绍

    JavaScript语法:只要Java会了,基本上javascript语法就会了. ——变量的定义 ——程序的结构控制 ——数组操作 ——函数的定义即使用 基本的test.html代码如下,它会导入下 ...

  2. javascript语法详解

    javascript语法:运算符 条件语句if...else...  条件语句switch  循环语句for  循环语句while   跳转语句 js运算符 1.算数运算符:+ - * % / ++ ...

  3. When Colon Scripting is comming(JavaScript语法扩充)

    当冒号脚本来临-- JavaScript语法扩充 连续好几夜的不能安眠,得出结论就是,未来语言未来的编译器应该是支持语法定制规则和语法扩展的,这样使得编程语言不断进化以更利于人类使用!of cours ...

  4. Javascript语法基础

    Javascript语法基础   一.基本数据类型   JavaScript中支持数字.字符串和布尔值三种基本数据类型: 1.数字 数字型是JavaScript中的基本数据类型.在JavaScript ...

  5. JavaScript语法细节——引用与复制

    原文:JavaScript语法细节--引用与复制 我们都知道,JS中变量的赋值有两种方式,最近在折腾自己写的标签栏插件,碰到了很多平时没注意的问题.正好,那边处理清楚了,稍微整理一下关于引用与复制相关 ...

  6. 第九十八节,JavaScript语法、关键保留字及变量

    JavaScript语法.关键保留字及变量 学习要点: 1.语法构成 2.关键字保留字 3.变量 任何语言的核心都必然会描述这门语言最基本的工作原理.而JavaScript的语言核心就是ECMAScr ...

  7. JavaScript 语法

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...

  8. JavaScript DOM 编程艺术(1)---> JavaScript语法

    一.  JavaScript语法目录 语法 操作 条件语句 循环语句 函数 对象 二.  具体内容 2.1 语法 javaScript代码要通过HTML/XHTML文档才能执行.可以有两种方式完成这一 ...

  9. JavaScript语法详解:JS简介&变量

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. JavaScript简介 Web前端有三层: HTML:从语义的角度,描 ...

  10. 读《javascript语法精粹》知识点总结

    昨天泡了大半天的读书馆,一口气看完了<javascript语法精粹>这本书,总体来说这本书还是写的不错,难怪那么多的推荐.<javascript语法精粹>主要是归纳与总结了ja ...

随机推荐

  1. Oracle简单的SQL处理

    --单表插入insert into hr.job(job_id,job_title,min_salary) values('IT','Project Manager',50000); insert i ...

  2. 【转】UBUNTU 下GIT的安装

    原文网址:http://www.cnblogs.com/perseus/archive/2012/01/06/2314069.html linux下软件的安装方式有多种,最简单的莫过于从软件中心直接安 ...

  3. 增强型for和Iterator学习

    1,增强for和对于非集合类(没有实现 Iterable接口)的数组遍历效果一样 2,对于集合类,就是隐式调用迭代器 iterator的遍历,各有各个场合 3,对于arraylist来所,由于数据结构 ...

  4. 提高Android Studio的Build速度实践

    1.在下面的目录创建gradle.properties文件 /home/<username>/.gradle/ (Linux) /Users/<username>/.gradl ...

  5. WinForm 每用户只允许创建一个实例

    string mutexName = System.Environment.UserName + "nono"; bool runone; System.Threading.Mut ...

  6. ruby的代码风格

    http://stylesror.github.io/ 大部分同意,有小部分,不敢苟同.

  7. 关于 App.config文件出错,配置系统未能初始化。 问题解决方案

    如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元素.将appSettings放到configSecti ...

  8. NOIP2013 Day2

    1.积木大赛 https://www.luogu.org/problemnew/show/1969 这道题在考试时暴力得比较麻烦,导致只得了80分,t了两个点. 思路为寻找一个区间内高度大于0的最低点 ...

  9. Bootstrap-Plugin:弹出框(Popover)插件

    ylbtech-Bootstrap-Plugin:弹出框(Popover)插件 1.返回顶部 1. Bootstrap 弹出框(Popover)插件 弹出框(Popover)与工具提示(Tooltip ...

  10. [LigerUI]使用记录

    1. 下拉框设定 鼠标移开隐藏 但想改变下拉框大小时 很难一次定位到下拉框右下角那个点 2. ligerTab 自带标题菜单 但想修改成类似于 chrome 的标题菜单时 貌似没有找到方法 我用 ea ...