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. Testng优势

    选择Testng的理由: 1.可指定执行顺序, dependsOnMethods 属性来应对测试的依赖性问题. 2.·参数化1:轻轻松松从XML中得到参数 @BeforeClass public vo ...

  2. LCD RGB 控制技术讲解 — 时钟篇(上)

    时序图 下面是LCD RGB 控制的典型时序图  天啊,一下就上这玩意,怎么看??? 其实要解释上面的时序图,我们还需要了解一些LCD的显示过程.所以现在只是有个印象,稍后我们详细讲解. LCD显示流 ...

  3. js基础篇(dom操作,字符串,this等)

    首先我们来看这样一道题 <div id='foo' class='aa bb cc'></div>写出如何判断此div中是否含有aa(注:aa成立,aaa不成立) 首先,我们一 ...

  4. jvectormap地图开发和制作任意国家地图

    jvectormap官网上提供了世界地图和很多国家的地图,但不是所有国家的地图都有,比如沙特阿拉伯的国家地图就没有,怎么办呢? 在http://www.amcharts.com/svg-maps/上下 ...

  5. django内置html模板的extends和include,模板标签{{ ex }}

    base.html内容 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  6. linux 单网卡来绑定多IP实现多网段访问以及多网卡绑定单IP实现负载均衡

    ifconfig eth0 hw AA:BB:CC:DD:EE:FF

  7. OpenMP 旅行商问题,静态调度

    ▶ <并行程序设计导论>第六章中讨论了旅行商,分别使用了 MPI,Pthreads,OpenMP 来进行实现,这里是 OpenMP 的代码,分为静态调度(每个线程分分配等量的搜索人物)和动 ...

  8. 36. Valid Sudoku + 37. Sudoku Solver

    ▶ 有关数独的两个问题. ▶ 36. 检测当前盘面是否有矛盾(同一行.同一列或 3 × 3 的小框内数字重复),而不关心该盘面是否有解. ● 初版代码,24 ms,没有将格子检测函数独立出去,行检测. ...

  9. 517. Super Washing Machines

    ▶ 超级洗碗机.给定一个有 n 元素的整数数组,我们把 “将指定位置上元素的值减 1,同时其左侧或者右侧相邻元素的值加 1” 称为一次操作,每个回合内,可以选定任意 1 至 n 个位置进行独立的操作, ...

  10. Richview 首页 奇偶页 不同页眉页脚

    首页 奇偶页 不同页眉页脚 ScaleRichView v6.0 Different headers and footers for the first page, for odd and even ...