Javascript 函数及其执行环境和作用域
函数在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 函数及其执行环境和作用域的更多相关文章
- javascript中函数的执行环境、作用域链、变量对象与活动对象
javascript高级程序设计中:对执行环境.作用域链.变量对象.活动对象的解释: 1.执行环境: 执行环境:有时也叫环境:是JavaScript中最为重要的一个概念:执行环境定义了变量或函数有权访 ...
- Javascript高级程序设计——执行环境与作用域
Javascript中执行环境是定义了变量或函数有权访问的其他数据,决定了各自的行为,每个执行的环境都有一个与之关联的变量对象,环境中定义的所以变量和函数都保存在这个对象中. 全局执行环境是最外围的一 ...
- 【JS】JavaScript中的执行环境与作用域
JavaScript中的执行环境定义了变量或函数有权访问的数据(每个函数都有自己的执行环境),全局执行环境是最外围的执行环境,在浏览器中,全局执行环境就是window对象,所以所有的全局变量和函数都是 ...
- javascript基础进阶——执行环境及作用域链
概念 执行环境 执行环境定义了变量或函数有权访问的其他函数,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象. 变量对象 环境中定义的所有变量和函数都保存在这个对象中. 全局执行环境 全局 ...
- JavaScript:理解执行环境、作用域链和活动对象
作用域的原理,对JS将如何解析标识符做出了解答.而作用域的形成与执行环境和活动对象紧密相关. 我们对于JS标识符解析的判断,存在一个常见误区 首先,看一个关于JS标识符解析的问题 ,源于风雪之隅提出的 ...
- JavaScript语言精粹--执行环境及作用域,this
1.执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为. 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中. 虽然我们无法访问,但是解析器在处理数据时 ...
- javascript学习笔记 - 执行环境及作用域
一 执行环境(环境) 1.每个执行环境都有一个关联的全局变量对象.例如:web浏览器中,window对象为全局变量对象.环境中定义的所有变量和函数都保存在该对象中.全局执行环境是最外围的环境. 2.执 ...
- 深入理解javascript中执行环境(作用域)与作用域链
深入理解javascript中执行环境(作用域)与作用域链 相信很多初学者对与javascript中的执行环境与作用域链不能很好的理解,这里,我会按照自己的理解同大家一起分享. 一般情况下,我们把执行 ...
- JavaScript 执行环境以及作用域链
执行环境(execution context,为简单起见,有时也称为"环境")是 JavaScript 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们 ...
随机推荐
- linux下mysql的远程访问
安装了虚拟机centos,安装mysql后,在win7下无法用工具访问mysql.提示连接失败. 1.授权远程访问. GRANT ALL PRIVILEGES ON databasename.* TO ...
- JavaScript getter和setter
对象的属性是由属性名name,值key,和其他特性(可读写性 writable,可枚举性enumerable,可配置性configurable)组成的.从ES5开发,提供了getter和setter ...
- D13——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D13 20180918内容纲要: 堡垒机运维开发 1.堡垒机的介绍 2.堡垒机的架构 3.小结 4.堡垒机的功能实现需求 1 堡垒机的介绍 百度百科 随着信息安 ...
- 初印象至Vue路由
初印象系列为快速了解一门技术的内容,后续会推出本人应用这门技术时发现的一些认识. Vue路由和传统路由的区别: Vue路由主要是用来实现单页面应用内各个组件之间的切换,同样支持传递参数等功能.而传统路 ...
- android自定义控件 几种方式总结
方式1:不继承任何组件 , 直接在代码里面调用实例化.public class ProgressDialog { private Dialog dialog; public ProgressDialo ...
- 修改Hosts文件提示没有权限怎么办
解决办法:给host文件赋予权限 1.打开电脑C盘,在目录C:\Windows\System32\drivers\etc 下找到hosts文件 2.右键hosts文件,选择属性 3.点击hosts属性 ...
- 《垃圾回收的算法与实现》——Python垃圾回收
Python垃圾回收 python采用引用计数法进行垃圾回收 Python内存分配 python在分配内存空间时,在malloc之上堆放了3个独立的分层. python内存分配时主要由arena.po ...
- 详解C#泛型(二)
一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { Type generi ...
- sql-原生jdbc连接7步
原生jdbc链接一般分为7步, 来获取链接并执行sql语句 1, 准备4大参数 static { url = "jdbc:mysql://localhost:3306/test" ...
- VIM学习网址和资料收集
摘要:这篇博客主要收集一些学习VIM的好网址和资料 娄老师的一篇VIM 原文地址:http://www.cnblogs.com/rocedu/p/6012444.html Github上VIM的学习 ...