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 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们 ...
随机推荐
- java 路径的问题
在项目开发中会碰到各种各样的获取项目路径的一些问题: 1:java项目: 以获取 类路径下的mess.properties 为例来说明: 文件在项目中的位置: src/bz/beppe/demo/r ...
- python之ETL数据清洗案例源代码
#python语言 import pandas as pd import time data = pd.read_excel('ETL_数据清洗挑战.xlsx','测试数据',dtype=str)#读 ...
- D14——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D14 20180919内容纲要: 1.html认识 2.常用标签 3.京东html 4.小结 5.练习(简易淘宝html) 1.html初识(HyperText ...
- POJ 2546
#include<iostream> #include<numeric> #include<iomanip> #include<algorithm> # ...
- 关于oracle RAC心跳线采用直连 还是交换机连接的建议
关于oracle RAC心跳线的连接方式,各个论坛,包括网上文章的说法是:官方说是不建议直连,建议采用交换机连接的方式!PS:但是,一直没有找到官方文档的出处,有知道的兄弟,烦请评论区提供下地址!!! ...
- EFCore.MySql当模型遇到int[]怎么办
我使用的是Pomole.EntityFrameworkCore.MySql 需要将旧项目中的excels表转成实体,其中有一列是json格式的int[] 当遇到第一张表的时候,我使用了这样的方法来读取 ...
- 课程二(Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization),第一周(Practical aspects of Deep Learning) —— 4.Programming assignments:Gradient Checking
Gradient Checking Welcome to this week's third programming assignment! You will be implementing grad ...
- 使用 Redis 共享 Session 会话
储存模式 1.InProc模式 这是ASP.NET默认的Session管理模式,在应用进程内维护Session. 2.StateServer模式 这是在服务器装了.NET环境后自带的一个StateSe ...
- 使用vue3.0和element实现后台管理模板
通过自己所学的这段时间,利用空余时间,使用vue3.0脚手架搭建的一个关于后台的管理模板,所实现功能也是模仿一个后台的界面,数据分为两种存放,一种是直接存储到mlab,这里的数据是存放这登录注册,只有 ...
- Ajax初始接触
演示JS对象的属性,方法和事件的使用 (1)window.location.href (2)form.submit() <form action="" method=&quo ...