函数在javascript中可以说是一等公民,也是最有意思的事情,javascript函数其实也是一个对象,是Function类型的实例。因此声明一个函数首先可以使用 Function构造函数:

var saySomething = new Function("something","console.log(something)");
saySomething("hello world!"); // 输出hello world!

Function构造函数可以接受多个参数,但最后一个参数被视为函数体,当然这种方法不直观,因此大部分时候我们使用如下声明:

var saySomething = function(something){
console.log(something);
};
saySomething("hello world!"); // 输出hello world!

或者:

function saySomething(something){
console.log(something);
};
saySomething("hello world!"); // 输出hello world!

这样直观也便于理解多了。

由于函数是一个对象,因此函数名就是一个指向函数对象的指针。如下面示例代码:

示例1:

function makeCounter() {
var i = 0;
console.log( ++i );
} var counter2=makeCounter; //无输出
counter2(); //输出:1
counter2(); //输出:1

var counter2=makeCounter; 这句其实就是将函数makeCounter的引用给了counter2, counter2就是一个别名,它们都指向同一个函数。因此这句 无输出

接来下的 counter2(); 两次就是对函数调用两次,每次调用, 局部变量 i 在调用结束后就不能范问了,因此两次返回的结果都是 输出:1

当函数第一次被调用时,会创建一个执行环境,以及相应的作用域链。执行环境中定义变量和函数都保存在一个称为变量对象的结构中。执行环境通常可分为全局执行环境和局部执行环境。全局执行环境是最外围的执行环境,根据js的宿主不同而异,在web中是 window对象,在node中是 globle对象。因此所有的全局变量和函数都属于全局执行环境,也就是 window对象的属性和方法。

每个函数都有自己的执行环境,当代码执行进入一个函数时首先将会创建一个执行环境,这个过程首先是创建活动对象,活动对象在一开始是只包含一个变量,即arguments对象,然后是 this对象 以及其他的内部变量。作用域链保存这函数有权访问的执行环境的先后顺序,作用域链的最前端始终是当前执行的代码所在的环境的活动对象,下一个是包含该函数的外部环境,再下一个是包含该函数的外部的外部环境,这样类推,直至全局环境。

当访问一个变量时,需要搜索该变量标识符。搜索过程从作用域链的最前端开始,向上逐级查找,直至第一个找到时停止,如果直到全局环境的活动对象中都找不到,说明该变量未声明。

var color="blue";
function getColor(){
var color='red';
return color;
}
console.log(getColor()); // 输出:red

getColor函数首先在当前的执行环境中找到了 color定义,于是输出 red,停止。

var color="blue";
function getColor(){
return color;
}
console.log(getColor()); // 输出:blue

getColor函数首先在当前的执行环境中没有找到 color定义,于是向上一层查找,在全局环境中找到了 color定义,于是输出 blue。

另外一个需要注意的是 javascript中是没有块级作用域的,不像 C,Java等,在一对花括号 {  } 包围起来的区域都有自己的作用域。

if(true){
var color="blue";
}
console.log(color); // 输出:blue

由于 javascript没有块级作用域,因此,在 { } 之外,仍然能够访问到 color 为 blue的定义。

Javascript 函数及其执行环境和作用域的更多相关文章

  1. javascript中函数的执行环境、作用域链、变量对象与活动对象

    javascript高级程序设计中:对执行环境.作用域链.变量对象.活动对象的解释: 1.执行环境: 执行环境:有时也叫环境:是JavaScript中最为重要的一个概念:执行环境定义了变量或函数有权访 ...

  2. Javascript高级程序设计——执行环境与作用域

    Javascript中执行环境是定义了变量或函数有权访问的其他数据,决定了各自的行为,每个执行的环境都有一个与之关联的变量对象,环境中定义的所以变量和函数都保存在这个对象中. 全局执行环境是最外围的一 ...

  3. 【JS】JavaScript中的执行环境与作用域

    JavaScript中的执行环境定义了变量或函数有权访问的数据(每个函数都有自己的执行环境),全局执行环境是最外围的执行环境,在浏览器中,全局执行环境就是window对象,所以所有的全局变量和函数都是 ...

  4. javascript基础进阶——执行环境及作用域链

    概念 执行环境 执行环境定义了变量或函数有权访问的其他函数,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象. 变量对象 环境中定义的所有变量和函数都保存在这个对象中. 全局执行环境 全局 ...

  5. JavaScript:理解执行环境、作用域链和活动对象

    作用域的原理,对JS将如何解析标识符做出了解答.而作用域的形成与执行环境和活动对象紧密相关. 我们对于JS标识符解析的判断,存在一个常见误区 首先,看一个关于JS标识符解析的问题 ,源于风雪之隅提出的 ...

  6. JavaScript语言精粹--执行环境及作用域,this

    1.执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为. 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中. 虽然我们无法访问,但是解析器在处理数据时 ...

  7. javascript学习笔记 - 执行环境及作用域

    一 执行环境(环境) 1.每个执行环境都有一个关联的全局变量对象.例如:web浏览器中,window对象为全局变量对象.环境中定义的所有变量和函数都保存在该对象中.全局执行环境是最外围的环境. 2.执 ...

  8. 深入理解javascript中执行环境(作用域)与作用域链

    深入理解javascript中执行环境(作用域)与作用域链 相信很多初学者对与javascript中的执行环境与作用域链不能很好的理解,这里,我会按照自己的理解同大家一起分享. 一般情况下,我们把执行 ...

  9. JavaScript 执行环境以及作用域链

    执行环境(execution context,为简单起见,有时也称为"环境")是 JavaScript 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们 ...

随机推荐

  1. django 之 发送邮箱

    发送邮箱的话首先在settings文件里写下边的这些设置: #邮件服务配置文件 SSL认证,验证 EMAIL_USE_SSL = True #邮箱服务 EMAIL_HOST = 'smtp.qq.co ...

  2. 03-01 Java运算符

    (1)算术运算符 A:+,-,*,/,%,++,-- B:+的用法 a:加法 b:正号 c:字符串连接符 C:/和%的区别 数据做除法操作的时候,/取得是商,%取得是余数 D:++和--的用法 a:他 ...

  3. NPOI读取excel文件导出数据, 而此时文件正在打开中抛异常怎么办

    项目中需要用到一些数值表格, 方便起见都是用excel来的. 而如果excel正打开中, 直接使用npoi制作的工具来导出数据的话, 在这一行将会异常: workbook = new XSSFWork ...

  4. 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 3.Programming Assignment : Planar data classification with a hidden layer

    Planar data classification with a hidden layer Welcome to the second programming exercise of the dee ...

  5. windows系统numpy的下载与安装教程

    numpy是一款基于python的功能强大的科学计算包.要安装numpy首先你得先安装python.python的安装非常简单,本人安装的是python3.4. 工具/原料 安装好的python程序 ...

  6. Mac 安装 Ruby, Rails 运行环境

    对于新入门的开发者,如何安装 Ruby, Ruby Gems 和 Rails 的运行环境可能会是个问题,本页主要介绍如何用一条靠谱的路子快速安装 Ruby 开发环境. 次安装方法同样适用于产品环境! ...

  7. 拥抱了IDEA却发现再也回不去Eclipse...

    一.背景 还记得去年入职的时候,发现很多同事都在用Intellij IDEA,其实在那之前都已经接触过,只不过没有在开发中实际应用而已. 这时候我下定决心要拥抱IDEA了,尤其被它酷酷的黑色主题所吸引 ...

  8. ActiveMQ——activemq的报错见解javax.jms.JMSException: Software caused connection abort: recv failed

    activeMQ出现javax.jms.JMSException: Software caused connection abort: recv failed的问题解决 一直找不到原因,原来是在本地的 ...

  9. PTA (Advanced Level) 1009 Product of Polynomials

    1009 Product of Polynomials This time, you are supposed to find A×B where A and B are two polynomial ...

  10. Centos7下使用yum安装lnmp zabbix3.2

    1:配置epel-release mysql zabbix 源 配置epel源 wget http://mirrors.aliyun.com/epel/epel-release-latest-7.no ...