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. IO流常规操作

    IO流 IO就是输入输出,IO设备在计算机中起着举足轻重的作用,IO流也就是输入输出流,用来交互数据,程序和程序交互,程序也可以和网络等媒介交互. 一.IO流的分类 要分类,肯定得站得不同角度来看这个 ...

  2. chaos-engineering 的一些开源工具

    Chaos Monkey - A resiliency tool that helps applications tolerate random instance failures. The Simi ...

  3. FastAdmin 插件配置文件 info.ini 中的 state 什么意思?

    FastAdmin 插件配置文件 info.ini 中的 state 什么意思? 在插件配置中有一个 state ,这是配置插件开关的.

  4. Django 思维导图

  5. 简化Redis数据访问代码RedisTemplate

    ---恢复内容开始--- Redis数据结构简介: Redis可以存储键与5中数据结构类型之间的映射,这5中数据结构类型分别是;String(字符串),List(列表),Set(集合),Hash(散列 ...

  6. Centos6.5安装phpldapadmin

    phpLDAPadmin是一个基于Web的LDAP管理工具用于管理LDAP服务器的各个方面.你可以利用它浏览LDAP Tree,创建/删除/修改和复制节点(entry) ,执行搜索,导入/导出LDIF ...

  7. HDU-6156 Palindrome Function(数位DP)

    一.题目 二.思路 1.这是很明显的数位DP: 2.和以往数位DP不同的是,这里带了个进制进来,而以往做是纯十进制下或者纯二进制下做操作.但是,不管多少进制,原理都是一样的: 3.这里有个小坑,题目中 ...

  8. Python单例模式实现方法

    一  简介 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源 ...

  9. uwsgi配置文件的一些细节,uwsgi错误invalid request block size

    [uwsgi] #socket = #这种是使用代理方式访问的,不能直接输入端口访问,要搭配其他的HTTP服务比如NGINX,设置反向代理 http =: #这种是直接可以输入IP端口访问 modul ...

  10. Selenium Webdriver——设置等待时间

    1.隐式等待 implicitlyWait(): 当使用了隐士等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常 当查找元素或元素并 ...