作为从一开始接触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. Android 读取SIM卡参数

    package com.water.activity; import java.util.List; import android.app.Activity; import android.os.Bu ...

  2. MySQL 性能监控 4 大指标

    [编者按]本文作者为 John Matson,主要介绍 mysql 性能监控应该关注的 4 大指标. 文章系国内 ITOM 管理平台 OneAPM 编译呈现.    MySQL 是什么? MySQL  ...

  3. HTML5表单内元素的required属性

    当表单内元素(如input.textarea)中有required属性并且值不为false的时候,则该字段不能为空,否则提交失败. <input type="text" au ...

  4. JS判断单选框是否选中

    判断单选框是否选中$("#isallday").attr("checked")

  5. JavaScript中的作用域与函数和变量声明的提升

      var foo = 1; function bar() {     if (!foo) {         var foo = 10;     }     alert(foo); } bar(); ...

  6. table tr分离并加圆角和阴影

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. IP地址,子网掩码划分(转)

    IP地址划分教程 IP和子网掩码我们都知道,IP是由四段数字组成,在此,我们先来了解一下3类常用的IP A类IP段 0.0.0.0 到127.255.255.255 B类IP段 128.0.0.0 到 ...

  8. smarty实现缓存

    首先需要在mySmarty中添加配置信息,开启缓存,设置缓存文件存放目录,设置缓存时间缓存可以实现减少访问数据库,减轻数据库压力,访问一次数据库,形成静态页面,下次直接调用这个页面,也可以用nocac ...

  9. Html5 Video 实现方案

    来源:http://ask.dcloud.net.cn/article/569 源码下载 前言: 最近项目中需要用到html5 视频播放功能,于是稍微研究了解了下,遇到了很多坑,特此记录下. 一. H ...

  10. Android之Http网络编程(一)

    Android应用作为一个客户端程序绝大部分都是需要进行网络请求和访问的,而http通信是一种比较常见并常用的通信方式. 在Android中http网络编程中有两种实现方式,一种是使用HttpURLC ...