执行环境及作用域、变量对象、作用域链、闭包
2018-06-24 01:58:20来源:未知 阅读 ()
一:
执行环境及作用域 和 变量对象
var color = "blue";
function changeColor(){
var anotherColor = "red";
// 这里可以访问color和anotherColor
}
// 这里只能访问color
changeColor();
执行环境是javascript中最为重要的一个概念。每个执行环境都有一个与之关联的变量对象(保存执行环境中所有定义的变量和函数)。
作用域链
二:
-
当代码在执行环境中执行时,会创建一个作用域链。作用域链本质是一个指向变量对象的指针列表。
-
如果执行环境是函数,则将其活动对象(最开始时只包含一个变量->argument对象)作为变量对象。ps:argument对象在全局环境中是不存在的.
-
(基于2条件下)作用域链中的下一个变量对象来自外部环境,而再下一个变量对象则来自下下个外部环境。这样,一直延续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象。
三:js没有块级作用域
if (true) {
var color = "blue";
}
alert(color); //"blue"
注:在js中if语句中的变量申明会将变量添加到if外部的执行环境中(当前是指window变量);此时window变量对象中有一个值是 color = 'blue'
for (var i=0; i < 10; i++){
doSomething(i);
}
alert(i); //10
注:在js中for循环结束后依然会存在循环外部的执行环境中,即window变量对象有 i = 10
四:
闭包
闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另一个函数。
eg: function createComparisonFunction(propertyName) {
return function(object1, object2){
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if (value1 < value2){
return -1;
} else if (value1 > value2){
return 1;
} else {
return 0;
}
};
}
//创建函数
var compareNames = createComparisonFunction("name");
//调用函数
var result = compareNames({ name: "Nicholas" }, { name: "Greg" });
注:createComparisonFunction()函数返回后,其执行环境的作用域链会被销毁,但它的活动对象仍然会留在内存中,匿名函数的作用域链仍然在引用这个活动对象
以上是作用域链的这种配置机制引出了一个副作用,即闭包只能获取外部函数任何变量的最后一个值
function createFunctions(){
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function(){
return i;
};
}
console.log(i) // i = 10
for (var j = 0; j < 10; j++){
console.log(result[j]()); // 打印10个10
}
return result;
}
createFunctions();
修改:
function createFunctions(){
var result = new Array();
for (var i = 0; i < 10; i++){
result[i] = function(num){
return num;
}(i);
}
console.log(result); // [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
return result;
}
createFunctions();
-----借鉴于javascript高级程序设计,有不足之处,欢迎指点
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:(转载)柯里化函数应用
- vue.js开发环境搭建教程 2020-03-16
- Node.js中环境变量process.env的一些事详解 2020-01-17
- javascript动态判断html元素并执行不同的操作 2019-11-30
- js函数 2019-08-14
- JS变量、作用域 2019-08-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash