作为从一开始接触C、C++、C#的程序员而言,JavaScript的语法对我来说有些古怪,通过最近一年的接触,对它有了一定的了解,于是想把它的一些语法要点记录下来。

1. Block Scope vs. Function Scope

JavaScript第一点与C不同的是变量的作用范围。我们都知道,C风格的编程语言中,变量的作用范围是两个大括号之间,变量在两个大括号之外是不可见的,我们称之为Block Scope。

而JavaScript则不然 - 变量在真个函数内以及此函数的内嵌函数中均可见,我们称之为Function Scope。比如:

function test(o){

  var i = 0;

  if (typeof o == "object"){

    var j = 0;

    for (var k = 0; k < 10; k++){

      console.log(k);

    }

    console.log(k); // k = 10, k虽然在for循环中定义,可是在for循环之外的整个函数体依然可见。

  }

  console.log(j); // j =0 或者j = undefined,j虽然在if块中声明并定义,可是它在整个函数体中依然可见。

}

2. Hoisting

JavaScript变量的另外一个奇特的地方还在于,在一个函数体内任何一个地方定义(defined)的变量,都被假定为其在函数的一开始处被定义(但是可能没有初始化)。也就是说,所有变量的定义都被"hoisted"(提升)到函数的开始处。比如下面这个例子:

var scope = "global";

function f(){

  console.log(scope); // 输出"undefined",而不是"global",因为本地的scope变量已经生效,只是还没有初始化。

  var scope = "local"; // 在此处初始化,但是其实已经在函数的开始处被声明了,因此上面的代码输出的是"undefined"

  console.log(scope); //输出"local"

}

总而言之,JavaScript是一个Lexically Scoped Language,即JavaScript是基于词法作用域(lexically scoped)的,所以标识符被固定在它们被定义的作用域而不是语法上或是其被调用时的作用域。

JavaScript的语法要点 1 - Lexically Scoped Language的更多相关文章

  1. JavaScript的语法要点 2 - Scope Chain

    前文所述,JavaScript是基于词法作用域(lexically scoped)的,所以标识符被固定在它们被定义的作用域而不是语法上或是其被调用时的作用域.即全局变量的作用域是整个程序,局部变量的作 ...

  2. JavaScript的语法要点 4 - 面向对象的基础

    在传统的面向对象语言如C++.C#.Java中有类.对象.继承等概念.在JavaScript中又如何表示呢?JavaScript中没有class关键字,JavaScript中的类.对象.继承的概念是通 ...

  3. JavaScript的语法要点 3 - Calling Context

    上一篇讲了JavaScript的Scope Chain - 每一个函数都有一个scope chain与之关联,scope chain上有第一个对象维护着本地变量作为其属性.另外我们在JavaScrip ...

  4. JavaScript基本语法(一)

    前段时间学习了HTML和CSS,也实战了一些结构较简单的项目.在还没运用到JS的知识时,做出来的效果总觉得少了些什么.虽然总体布局与一些基本的特效,也能用HTML+CSS就能完成.但如今开始进入Jav ...

  5. css3【语法要点】

    语法要点 display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit browsers. */ display ...

  6. javascript运算符语法概述

    × 目录 [1]个数 [2]优先级 [3]结合性[4]类型[5]规则表 前面的话 javascript中的运算符大多由标点符号表示,少数由关键字表示,它们的语法言简意赅,它们的数量却着实不少.运算符始 ...

  7. javascript基础语法——表达式

    × 目录 [1]原始表达式 [2]复杂表达式 前面的话 一般地,关于javascript基础语法,人们听得比较多的术语是操作符和语句.但是,其实还有一个术语经常使用,却很少被提到,这就是javascr ...

  8. javascript基础语法——词法结构

    × 目录 [1]java [2]定义 [3]大小写[4]保留字[5]注释[6]空白[7]分号 前面的话 javascript是一门简单的语言,也是一门复杂的语言.说它简单,是因为学会使用它只需片刻功夫 ...

  9. JavaScript的语法规则

    JavaScript的语法规则 JavaScript区分大小写 JavaScript脚本程序须嵌入在HTML文件中 JavaScript脚本程序中不能包含HTML标记代码 每行写一条脚本语句 语句末尾 ...

随机推荐

  1. 在centos上使用yum安装redis及php扩展php-redis

    .wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -ivh epel-rele ...

  2. Android(java)学习笔记137:Android中SimpleAdapter,ArrayAdapter和BaseAdapter常见的适配器

    1.SimpleAdapter(BaseAdapter子类扩展类): simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片)等.可以显示比较复杂的列表, ...

  3. Mysql-5.6乱码问题

    1 参考:http://www.testwo.com/blog/6930 mysql数据库默认的编码是:Latin1,要想支持中文需要修改为gbk/utf8的编码格式.   1.以root管理员身份查 ...

  4. Android_listView_BaseAdapter

    layout.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x ...

  5. mvn打包

    mvn install -DskipTests mvn install -Dmaven.test.skip=true

  6. [Doc ID 1590988.1]如何清理E-Business Suite的缓存(Apache/iAS, Cabo, Modplsql, Browser, Jinitiator, Java, Portal, WebADI)?

    文档内容   目标   解决方案   参考 适用于: Oracle Applications Technology Stack - 版本 11.5.9 到 12.2.2 [发行版 11.5 到 12. ...

  7. SpringMVC与Struts2配置区别

     Spring MVC模型与Struts2模型应用:  Html表单: 上述这两段代码无论是SpringMVC还是Struts2,都可以共用.而在请求响应处理类(也就是Controller)上的设计差 ...

  8. javascript/jquery给动态加载的元素添加click事件

    /** 这种写法:在重新加载数据后事件依然有效*/$(document).on('click', '#district_layer ul li', function () { });

  9. 简单的monkey使用

    先推荐大家看一篇http://www.cnblogs.com/wfh1988/archive/2010/11/16/1878224.html,里面有一些命令的使用 简单在说就是象猴子一样乱点,为了测试 ...

  10. asp下实现多条件模糊查询SQL语句

    常写一个简单的模糊查询的SQL语句格式可以如下例: sql="select * from 表名 where 字段名 like ’%" & request.form(&quo ...